2 * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.
\r
4 * This file is part of GSS.
\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
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
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
19 package gr.ebs.gss.client;
\r
21 import gr.ebs.gss.client.dnd.DnDSimpleFocusPanel;
\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
29 import java.util.ArrayList;
\r
30 import java.util.Collections;
\r
31 import java.util.Comparator;
\r
32 import java.util.List;
\r
34 import com.google.gwt.core.client.GWT;
\r
35 import com.google.gwt.dom.client.NativeEvent;
\r
36 import com.google.gwt.event.dom.client.ClickEvent;
\r
37 import com.google.gwt.event.dom.client.ClickHandler;
\r
38 import com.google.gwt.http.client.URL;
\r
39 import com.google.gwt.i18n.client.DateTimeFormat;
\r
40 import com.google.gwt.resources.client.ClientBundle;
\r
41 import com.google.gwt.resources.client.ImageResource;
\r
42 import com.google.gwt.user.client.DOM;
\r
43 import com.google.gwt.user.client.DeferredCommand;
\r
44 import com.google.gwt.user.client.Event;
\r
45 import com.google.gwt.user.client.IncrementalCommand;
\r
46 import com.google.gwt.user.client.Window;
\r
47 import com.google.gwt.user.client.ui.AbstractImagePrototype;
\r
48 import com.google.gwt.user.client.ui.Composite;
\r
49 import com.google.gwt.user.client.ui.Grid;
\r
50 import com.google.gwt.user.client.ui.HTML;
\r
51 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
\r
52 import com.google.gwt.user.client.ui.HorizontalPanel;
\r
53 import com.google.gwt.user.client.ui.VerticalPanel;
\r
54 import com.google.gwt.user.client.ui.HTMLTable.Cell;
\r
57 * A composite that displays a list of search results for a particular query on
\r
60 public class SearchResults extends Composite implements ClickHandler {
\r
62 private HTML prevButton = new HTML("<a href='javascript:;'>< Previous</a>", true);
\r
64 private HTML nextButton = new HTML("<a href='javascript:;'>Next ></a>", true);
\r
66 private String showingStats = "";
\r
68 private int startIndex = 0;
\r
71 * A constant that denotes the completion of an IncrementalCommand.
\r
73 public static final boolean DONE = false;
\r
75 private boolean clickControl = false;
\r
77 private boolean clickShift = false;
\r
79 private int firstShift = -1;
\r
81 private ArrayList<Integer> selectedRows = new ArrayList<Integer>();
\r
84 * The context menu for the selected file.
\r
86 final DnDSimpleFocusPanel contextMenu;
\r
89 * Specifies that the images available for this composite will be the ones
\r
90 * available in FileContextMenu.
\r
92 public interface Images extends ClientBundle,FileContextMenu.Images, Folders.Images {
\r
94 @Source("gr/ebs/gss/resources/blank.gif")
\r
95 ImageResource blank();
\r
97 @Source("gr/ebs/gss/resources/asc.png")
\r
98 ImageResource asc();
\r
100 @Source("gr/ebs/gss/resources/desc.png")
\r
101 ImageResource desc();
\r
105 * A label with the number of files in this folder.
\r
107 private HTML countLabel = new HTML();
\r
110 * The table widget with the file list.
\r
112 private FileTable table;
\r
115 * The navigation bar for paginating the results.
\r
117 private HorizontalPanel navBar = new HorizontalPanel();
\r
120 * The number of files in the search results
\r
122 private int folderFileCount;
\r
125 * Total search results size
\r
127 private long folderTotalSize;
\r
130 * A cache of the files in the list.
\r
132 private List<FileResource> files;
\r
135 * The widget's image bundle.
\r
137 private final Images images;
\r
139 private String sortingProperty = "name";
\r
141 private boolean sortingType = true;
\r
143 private HTML nameLabel;
\r
145 private HTML versionLabel;
\r
147 private HTML sizeLabel;
\r
149 private HTML dateLabel;
\r
151 private HTML ownerLabel;
\r
153 private HTML pathLabel;
\r
155 private HTML searchResults = new HTML("Results for search:");
\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
165 public SearchResults(final Images _images) {
\r
167 final GSS app = GSS.get();
\r
168 table = new FileTable(GSS.VISIBLE_FILE_COUNT + 1, 8) {
\r
171 public void onBrowserEvent(Event event) {
\r
172 if (DOM.eventGetType(event) == Event.ONMOUSEDOWN && DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT){
\r
173 if (DOM.eventGetCtrlKey(event))
\r
174 clickControl = true;
\r
176 clickControl = false;
\r
177 if (DOM.eventGetShiftKey(event)) {
\r
179 if (selectedRows.size() == 1)
\r
180 firstShift = selectedRows.get(0) - startIndex;
\r
181 //event.preventDefault();
\r
183 clickShift = false;
\r
185 //event.preventDefault();
\r
187 int ri = table.getRowForEvent2(event);
\r
189 if(!selectedRows.contains(ri-1))
\r
190 onRowClicked(ri, false);
\r
193 if (files == null || files.size() == 0) {
\r
194 if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && selectedRows.size() == 0) {
\r
195 FileContextMenu fm = new FileContextMenu(images, false, true);
\r
196 fm.onEmptyEvent(event);
\r
200 if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && selectedRows.size() != 0) {
\r
201 FileContextMenu fm = new FileContextMenu(images, false, false);
\r
203 } else if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && selectedRows.size() == 0) {
\r
204 FileContextMenu fm = new FileContextMenu(images, false, true);
\r
205 fm.onEmptyEvent(event);
\r
206 } else if (DOM.eventGetType(event) == Event.ONDBLCLICK)
\r
207 if (getSelectedFiles().size() == 1) {
\r
208 FileResource file = getSelectedFiles().get(0);
\r
209 String dateString = RestCommand.getDate();
\r
210 String resource = file.getUri().substring(app.getApiPath().length() - 1, file.getUri().length());
\r
211 String sig = app.getCurrentUserResource().getUsername() + " " +
\r
212 RestCommand.calculateSig("GET", dateString, resource,
\r
213 RestCommand.base64decode(app.getToken()));
\r
214 Window.open(file.getUri() + "?Authorization=" + URL.encodeComponent(sig) + "&Date=" + URL.encodeComponent(dateString), "_blank", "");
\r
215 event.preventDefault();
\r
218 if (DOM.eventGetType(event) == Event.ONCLICK) {
\r
219 if (DOM.eventGetCtrlKey(event))
\r
220 clickControl = true;
\r
222 clickControl = false;
\r
223 if (DOM.eventGetShiftKey(event)) {
\r
225 if (selectedRows.size() == 1)
\r
226 firstShift = selectedRows.get(0) - startIndex;
\r
227 //event.preventDefault();
\r
229 clickShift = false;
\r
231 //event.preventDefault();
\r
234 super.onBrowserEvent(event);
\r
237 prevButton.addClickHandler(this);
\r
238 nextButton.addClickHandler(this);
\r
240 contextMenu = new DnDSimpleFocusPanel(new HTML(AbstractImagePrototype.create(images.fileContextMenu()).getHTML()));
\r
241 contextMenu.addClickHandler(new FileContextMenu(images, false, false));
\r
242 app.getDragController().makeDraggable(contextMenu);
\r
244 // Setup the table.
\r
245 table.setCellSpacing(0);
\r
246 table.setCellPadding(2);
\r
247 table.setWidth("100%");
\r
250 table.addClickHandler(new ClickHandler() {
\r
253 public void onClick(ClickEvent event) {
\r
254 Cell cell = table.getCellForEvent(event);
\r
255 onRowClicked(cell.getRowIndex(),true);
\r
259 // Create the 'navigation' bar at the upper-right.
\r
260 HorizontalPanel innerNavBar = new HorizontalPanel();
\r
261 innerNavBar.setStyleName("gss-ListNavBar");
\r
262 innerNavBar.setSpacing(8);
\r
263 innerNavBar.add(prevButton);
\r
264 innerNavBar.add(countLabel);
\r
265 innerNavBar.add(nextButton);
\r
266 navBar.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
\r
267 navBar.add(innerNavBar);
\r
268 navBar.setWidth("100%");
\r
269 VerticalPanel vp = new VerticalPanel();
\r
270 vp.add(searchResults);
\r
271 searchResults.addStyleName("gss-searchLabel");
\r
274 table.setStyleName("gss-List");
\r
276 DeferredCommand.addCommand(new IncrementalCommand() {
\r
278 public boolean execute() {
\r
279 return fetchRootFolder();
\r
282 table.sinkEvents(Event.ONCONTEXTMENU);
\r
283 table.sinkEvents(Event.ONMOUSEUP);
\r
284 table.sinkEvents(Event.ONMOUSEDOWN);
\r
285 table.sinkEvents(Event.ONCLICK);
\r
286 table.sinkEvents(Event.ONKEYDOWN);
\r
287 table.sinkEvents(Event.ONDBLCLICK);
\r
288 preventIESelection();
\r
291 public void onClick(ClickEvent event) {
\r
292 if (event.getSource() == nextButton) {
\r
293 // Move forward a page.
\r
294 clearSelectedRows();
\r
295 startIndex += GSS.VISIBLE_FILE_COUNT;
\r
296 if (startIndex >= folderFileCount)
\r
297 startIndex -= GSS.VISIBLE_FILE_COUNT;
\r
300 } else if (event.getSource() == prevButton) {
\r
301 clearSelectedRows();
\r
302 // Move back a page.
\r
303 startIndex -= GSS.VISIBLE_FILE_COUNT;
\r
304 if (startIndex < 0)
\r
312 * Retrieve the root folder for the current user.
\r
314 * @return true if the retrieval was successful
\r
316 protected boolean fetchRootFolder() {
\r
317 UserResource user = GSS.get().getCurrentUserResource();
\r
320 updateFileCache("");
\r
324 public void onRowClicked(int row, boolean toggleSelection) {
\r
325 // Select the row that was clicked (-1 to account for header row).
\r
326 if (row > folderFileCount)
\r
329 GWT.log("ROW is:" + row + " fs:" + firstShift, null);
\r
330 if (firstShift == -1)
\r
332 else if (row > firstShift) {
\r
333 clearSelectedRows();
\r
334 for (int i = firstShift; i < row; i++) {
\r
335 selectedRows.add(startIndex + i);
\r
338 GSS.get().setCurrentSelection(getSelectedFiles());
\r
339 //contextMenu.setFiles(getSelectedFiles());
\r
340 table.setWidget(row, 0, contextMenu);
\r
341 } else if (row != -1 && row == firstShift) {
\r
342 selectedRows.add(row);
\r
343 selectedRows.add(row - 1);
\r
344 styleRow(row, true);
\r
345 styleRow(row - 1, true);
\r
346 } else if (row < firstShift) {
\r
347 GWT.log("ROW is:" + row + " fs:" + firstShift, null);
\r
348 clearSelectedRows();
\r
350 for (int i = firstShift; i >= row - 1; i--) {
\r
351 selectedRows.add(startIndex + i);
\r
354 GSS.get().setCurrentSelection(getSelectedFiles());
\r
355 table.setWidget(row, 0, contextMenu);
\r
356 //contextMenu.setFiles(getSelectedFiles());
\r
359 } else if (row > 0)
\r
360 selectRow(row - 1, toggleSelection);
\r
365 * Initializes the table so that it contains enough rows for a full page of
\r
368 private void initTable() {
\r
370 nameLabel = new HTML("Name");
\r
371 nameLabel.addClickHandler(new ClickHandler() {
\r
373 public void onClick(ClickEvent event) {
\r
378 versionLabel = new HTML("Version");
\r
379 versionLabel.addClickHandler(new ClickHandler() {
\r
381 public void onClick(ClickEvent event) {
\r
382 sortFiles("version");
\r
386 sizeLabel = new HTML("Size");
\r
387 sizeLabel.addClickHandler(new ClickHandler() {
\r
389 public void onClick(ClickEvent event) {
\r
394 dateLabel = new HTML("Last modified");
\r
395 dateLabel.addClickHandler(new ClickHandler() {
\r
397 public void onClick(ClickEvent event) {
\r
402 ownerLabel = new HTML("Owner");
\r
403 ownerLabel.addClickHandler(new ClickHandler() {
\r
405 public void onClick(ClickEvent event) {
\r
406 sortFiles("owner");
\r
411 pathLabel = new HTML("Path");
\r
412 pathLabel.addClickHandler(new ClickHandler() {
\r
414 public void onClick(ClickEvent event) {
\r
419 // Create the header row.
\r
420 table.setText(0, 0, "");
\r
421 // table.setText(0, 1, "Name");
\r
422 table.setWidget(0, 1, nameLabel);
\r
423 table.setWidget(0, 2, ownerLabel);
\r
424 // table.setText(0, 3, "Version");
\r
425 table.setWidget(0, 3, pathLabel);
\r
426 table.setWidget(0, 4, versionLabel);
\r
427 // table.setText(0, 4, "Size");
\r
428 table.setWidget(0, 5, sizeLabel);
\r
429 // table.setText(0, 5, "Last modified");
\r
430 table.setWidget(0, 6, dateLabel);
\r
431 table.setWidget(0, 7, navBar);
\r
432 table.getRowFormatter().setStyleName(0, "gss-ListHeader");
\r
434 // Initialize the rest of the rows.
\r
435 for (int i = 1; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {
\r
436 table.setText(i, 0, "");
\r
437 table.setText(i, 1, "");
\r
438 table.setText(i, 2, "");
\r
439 table.setText(i, 3, "");
\r
440 table.setText(i, 4, "");
\r
441 table.setText(i, 5, "");
\r
442 table.setText(i, 6, "");
\r
443 table.getCellFormatter().setWordWrap(i, 0, false);
\r
444 table.getCellFormatter().setWordWrap(i, 1, false);
\r
445 table.getCellFormatter().setWordWrap(i, 2, false);
\r
446 table.getCellFormatter().setWordWrap(i, 3, false);
\r
447 table.getCellFormatter().setWordWrap(i, 4, false);
\r
448 table.getCellFormatter().setWordWrap(i, 5, false);
\r
449 table.getCellFormatter().setWordWrap(i, 6, false);
\r
450 table.getCellFormatter().setHorizontalAlignment(i, 4, HasHorizontalAlignment.ALIGN_CENTER);
\r
452 prevButton.setVisible(false);
\r
453 nextButton.setVisible(false);
\r
457 * Selects the given row (relative to the current page).
\r
459 * @param row the row to be selected
\r
461 private void selectRow(final int row, boolean toggleSelection) {
\r
462 if (row < folderFileCount) {
\r
464 if (selectedRows.contains(row) && toggleSelection) {
\r
465 int i = selectedRows.indexOf(startIndex + row);
\r
466 selectedRows.remove(i);
\r
467 styleRow(row, false);
\r
469 for (int r : selectedRows) {
\r
470 int prow = r - startIndex;
\r
471 table.setWidget(prow + 1, 0, AbstractImagePrototype.create(images.document()).createImage());
\r
473 selectedRows.add(startIndex + row);
\r
474 styleRow(row, true);
\r
477 clearSelectedRows();
\r
478 selectedRows.add(startIndex + row);
\r
479 styleRow(row, true);
\r
481 if (selectedRows.size() == 1)
\r
482 GSS.get().setCurrentSelection(files.get(selectedRows.get(0)));
\r
484 GSS.get().setCurrentSelection(getSelectedFiles());
\r
485 //contextMenu.setFiles(getSelectedFiles());
\r
486 table.setWidget(row + 1, 0, contextMenu);
\r
490 public List<FileResource> getSelectedFiles() {
\r
491 List<FileResource> result = new ArrayList();
\r
492 for (int i : selectedRows)
\r
493 result.add(files.get(i));
\r
498 * Make the specified row look like selected or not, according to the
\r
499 * <code>selected</code> flag.
\r
504 void styleRow(final int row, final boolean selected) {
\r
505 if (row != -1 && row >= 0)
\r
507 table.getRowFormatter().addStyleName(row + 1, "gss-SelectedRow");
\r
509 table.getRowFormatter().removeStyleName(row + 1, "gss-SelectedRow");
\r
513 * Update the display of the file list.
\r
515 void update(boolean sort) {
\r
516 int count = folderFileCount;
\r
517 int max = startIndex + GSS.VISIBLE_FILE_COUNT;
\r
520 folderTotalSize = 0;
\r
522 if (sort && files != null && files.size() != 0) {
\r
524 clearSelectedRows();
\r
526 Collections.sort(files, new Comparator<FileResource>() {
\r
528 public int compare(FileResource arg0, FileResource arg1) {
\r
529 AbstractImagePrototype descPrototype = AbstractImagePrototype.create(images.desc());
\r
530 AbstractImagePrototype ascPrototype = AbstractImagePrototype.create(images.asc());
\r
532 if (sortingProperty.equals("version")) {
\r
533 versionLabel.setHTML("Version " + descPrototype.getHTML());
\r
534 return arg0.getVersion().compareTo(arg1.getVersion());
\r
535 } else if (sortingProperty.equals("owner")) {
\r
536 ownerLabel.setHTML("Owner " + descPrototype.getHTML());
\r
537 return arg0.getOwner().compareTo(arg1.getOwner());
\r
538 } else if (sortingProperty.equals("date")) {
\r
539 dateLabel.setHTML("Last modified " + descPrototype.getHTML());
\r
540 return arg0.getModificationDate().compareTo(arg1.getModificationDate());
\r
541 } else if (sortingProperty.equals("size")) {
\r
542 sizeLabel.setHTML("Size " + descPrototype.getHTML());
\r
543 return arg0.getContentLength().compareTo(arg1.getContentLength());
\r
544 } else if (sortingProperty.equals("name")) {
\r
545 nameLabel.setHTML("Name " + descPrototype.getHTML());
\r
546 return arg0.getName().compareTo(arg1.getName());
\r
547 } else if (sortingProperty.equals("path")) {
\r
548 pathLabel.setHTML("Path " + descPrototype.getHTML());
\r
549 return arg0.getUri().compareTo(arg1.getUri());
\r
551 nameLabel.setHTML("Name " + descPrototype.getHTML());
\r
552 return arg0.getName().compareTo(arg1.getName());
\r
554 else if (sortingProperty.equals("version")) {
\r
555 versionLabel.setHTML("Version " + ascPrototype.getHTML());
\r
556 return arg1.getVersion().compareTo(arg0.getVersion());
\r
557 } else if (sortingProperty.equals("owner")) {
\r
558 ownerLabel.setHTML("Owner " + ascPrototype.getHTML());
\r
559 return arg1.getOwner().compareTo(arg0.getOwner());
\r
560 } else if (sortingProperty.equals("date")) {
\r
561 dateLabel.setHTML("Last modified " + ascPrototype.getHTML());
\r
562 return arg1.getModificationDate().compareTo(arg0.getModificationDate());
\r
563 } else if (sortingProperty.equals("size")) {
\r
564 sizeLabel.setHTML("Size " + ascPrototype.getHTML());
\r
565 return arg1.getContentLength().compareTo(arg0.getContentLength());
\r
566 } else if (sortingProperty.equals("name")) {
\r
567 nameLabel.setHTML("Name " + ascPrototype.getHTML());
\r
568 return arg1.getName().compareTo(arg0.getName());
\r
569 } else if (sortingProperty.equals("path")) {
\r
570 pathLabel.setHTML("Path " + ascPrototype.getHTML());
\r
571 return arg1.getUri().compareTo(arg0.getUri());
\r
573 nameLabel.setHTML("Name " + ascPrototype.getHTML());
\r
574 return arg1.getName().compareTo(arg0.getName());
\r
581 // Show the selected files.
\r
583 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {
\r
584 // Don't read past the end.
\r
585 // if (i > folderFileCount)
\r
587 if (startIndex + i > folderFileCount)
\r
589 // Add a new row to the table, then set each of its columns to the
\r
591 table.setWidget(i, 0, AbstractImagePrototype.create(images.document()).createImage());
\r
592 FileResource fileHeader = files.get(startIndex + i - 1);
\r
593 table.getRowFormatter().addStyleName(i, "gss-fileRow");
\r
594 table.setHTML(i, 1, fileHeader.getName());
\r
595 table.setText(i, 2, fileHeader.getOwner());
\r
596 table.setText(i, 3, fileHeader.getPath());
\r
597 table.setText(i, 4, String.valueOf(fileHeader.getVersion()));
\r
598 table.setText(i, 5, String.valueOf(fileHeader.getFileSizeAsString()));
\r
599 final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
\r
600 table.setText(i, 6, formatter.format(fileHeader.getModificationDate()));
\r
601 folderTotalSize += fileHeader.getContentLength();
\r
604 // Clear any remaining slots.
\r
605 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {
\r
606 table.setHTML(i, 0, " ");
\r
607 table.setHTML(i, 1, " ");
\r
608 table.setHTML(i, 2, " ");
\r
609 table.setHTML(i, 3, " ");
\r
610 table.setHTML(i, 4, " ");
\r
611 table.setHTML(i, 5, " ");
\r
612 table.setHTML(i, 6, " ");
\r
613 table.setHTML(i, 7, " ");
\r
616 if (folderFileCount == 0) {
\r
617 showingStats = "no files";
\r
618 prevButton.setVisible(false);
\r
619 nextButton.setVisible(false);
\r
620 } else if (folderFileCount < GSS.VISIBLE_FILE_COUNT) {
\r
621 if (folderFileCount == 1)
\r
622 showingStats = "1 file";
\r
624 showingStats = folderFileCount + " files";
\r
625 showingStats += " (" + FileResource.getFileSizeAsString(folderTotalSize) + ")";
\r
626 prevButton.setVisible(false);
\r
627 nextButton.setVisible(false);
\r
629 showingStats = "" + (startIndex + 1) + " - " + max + " of " + count + " files" + " (" + FileResource.getFileSizeAsString(folderTotalSize) + ")";
\r
630 prevButton.setVisible(startIndex != 0);
\r
631 nextButton.setVisible(startIndex + GSS.VISIBLE_FILE_COUNT < count);
\r
633 updateCurrentlyShowingStats();
\r
637 * update status panel with currently showing file stats
\r
639 public void updateCurrentlyShowingStats() {
\r
640 GSS.get().getStatusPanel().updateCurrentlyShowing(showingStats);
\r
644 * Adjust the height of the table by adding and removing rows as necessary.
\r
646 * @param newHeight the new height to reach
\r
648 void resizeTableHeight(final int newHeight) {
\r
649 GWT.log("Panel: " + newHeight + ", parent: " + table.getParent().getOffsetHeight(), null);
\r
650 // Fill the rest with empty slots.
\r
651 if (newHeight > table.getOffsetHeight())
\r
652 while (newHeight > table.getOffsetHeight()) {
\r
653 // table.setHTML(table.getRowCount(), 5, " ");
\r
654 table.resizeRows(table.getRowCount() + 1);
\r
655 GWT.log("Table: " + table.getOffsetHeight() + ", rows: " + table.getRowCount(), null);
\r
658 while (newHeight < table.getOffsetHeight()) {
\r
659 // table.setHTML(table.getRowCount(), 5, " ");
\r
660 table.resizeRows(table.getRowCount() - 1);
\r
661 GWT.log("Table: " + table.getOffsetHeight() + ", rows: " + table.getRowCount(), null);
\r
666 * Update the file cache with data from the server.
\r
668 public void updateFileCache(String query) {
\r
669 final GSS app = GSS.get();
\r
670 clearSelectedRows();
\r
673 app.showLoadingIndicator();
\r
674 if (query == null || query.trim().equals("")) {
\r
675 searchResults.setHTML("You must specify a query");
\r
676 setFiles(new ArrayList());
\r
678 app.hideLoadingIndicator();
\r
680 searchResults.setHTML("Search results for " + query);
\r
682 GetCommand<SearchResource> eg = new GetCommand<SearchResource>(SearchResource.class,
\r
683 app.getApiPath() + "search/" + URL.encodeComponent(query), null) {
\r
686 public void onComplete() {
\r
687 SearchResource s = getResult();
\r
688 setFiles(s.getFiles());
\r
693 public void onError(Throwable t) {
\r
694 if(t instanceof RestException)
\r
695 app.displayError("Unable to perform search:"+((RestException)t).getHttpStatusText());
\r
697 app.displayError("System error performing search:"+t.getMessage());
\r
698 updateFileCache("");
\r
702 DeferredCommand.addCommand(eg);
\r
707 * Fill the file cache with data.
\r
710 * @param filePaths the files to set
\r
712 private void setFiles(List<FileResource> _files) {
\r
714 Collections.sort(files, new Comparator<FileResource>() {
\r
716 public int compare(FileResource arg0, FileResource arg1) {
\r
717 return arg0.getName().compareTo(arg1.getName());
\r
721 folderFileCount = files.size();
\r
722 GWT.log("File count:" + folderFileCount, null);
\r
725 private void sortFiles(final String sortProperty) {
\r
726 if (sortProperty.equals(sortingProperty))
\r
727 sortingType = !sortingType;
\r
729 sortingProperty = sortProperty;
\r
730 sortingType = true;
\r
735 private void clearLabels() {
\r
736 nameLabel.setText("Name");
\r
737 versionLabel.setText("Version");
\r
738 sizeLabel.setText("Size");
\r
739 dateLabel.setText("Last modified");
\r
740 ownerLabel.setText("Owner");
\r
741 pathLabel.setText("Path");
\r
745 * Retrieve the table.
\r
747 * @return the table
\r
754 * Does the list contains the requested filename
\r
757 * @return true/false
\r
759 public boolean contains(String fileName) {
\r
760 for (int i = 0; i < files.size(); i++)
\r
761 if (files.get(i).getName().equals(fileName))
\r
766 public void clearSelectedRows() {
\r
767 for (int r : selectedRows) {
\r
768 int row = r - startIndex;
\r
769 styleRow(row, false);
\r
770 table.setWidget(row + 1, 0, AbstractImagePrototype.create(images.document()).createImage());
\r
772 selectedRows.clear();
\r
773 Object sel = GSS.get().getCurrentSelection();
\r
774 if (sel instanceof FileResource || sel instanceof List)
\r
775 GSS.get().setCurrentSelection(null);
\r
778 public static native void preventIESelection() /*-{
\r
779 $doc.body.onselectstart = function () { return false; };
\r
782 public static native void enableIESelection() /*-{
\r
783 if ($doc.body.onselectstart != null)
\r
784 $doc.body.onselectstart = null;
\r
787 public void selectAllRows() {
\r
788 clearSelectedRows();
\r
789 int count = folderFileCount;
\r
792 int max = startIndex + GSS.VISIBLE_FILE_COUNT;
\r
796 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {
\r
797 // Don't read past the end.
\r
798 // if (i > folderFileCount)
\r
800 if (startIndex + i > folderFileCount)
\r
802 selectedRows.add(startIndex + i - 1);
\r
803 styleRow(i - 1, true);
\r
805 GSS.get().setCurrentSelection(getSelectedFiles());
\r
806 //contextMenu.setFiles(getSelectedFiles());
\r
807 table.setWidget(i - 1, 0, contextMenu);
\r