package edu.washington.cs.oneswarm.ui.gwt.client.fileDialog; import java.util.LinkedList; import java.util.Queue; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.OpenEvent; import com.google.gwt.event.logical.shared.OpenHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasTreeItems; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.VerticalPanel; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmGWT; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.ReportableErrorDialogBox; import edu.washington.cs.oneswarm.ui.gwt.client.i18n.OSMessages; import edu.washington.cs.oneswarm.ui.gwt.rpc.FileInfo; import edu.washington.cs.oneswarm.ui.gwt.rpc.OneSwarmUIServiceAsync; public class FileBrowser { private String session; private boolean directoryOk; private AsyncCallback<String> callback; protected static OSMessages msg; private OneSwarmUIServiceAsync fileSystem; private PopupPanel popup; private Queue<FileTreeItem> openItems; public FileBrowser(String session, boolean directoryOk, final AsyncCallback<String> callback) { this.session = session; this.callback = callback; this.directoryOk = directoryOk; msg = OneSwarmGWT.msg; } private void createPopup() { openItems = new LinkedList<FileTreeItem>(); final Tree fileTree = new Tree(); growTree(fileTree,""); fileTree.addOpenHandler(new OpenHandler<TreeItem>() { public void onOpen(OpenEvent<TreeItem> event) { FileTreeItem item = (FileTreeItem) event.getTarget(); if (item.isDirectory()) { if (!item.hasBeenExpanded){ growTree(item); } } closeItems(item.filePath()); openItems.add(item); } }); Button selectButton = new Button(msg.file_browser_button_select()); selectButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { FileTreeItem item = (FileTreeItem) fileTree.getSelectedItem(); if(item.fileStatus() == FileInfo.FileStatusFlag.NO_READ_PERMISSION) new ReportableErrorDialogBox(msg.file_browser_error_permission_denied(),false).show(); else if(!directoryOk && item.isDirectory()) new ReportableErrorDialogBox(msg.file_browser_error_directory_selected(),false).show(); else{ callback.onSuccess(item.filePath()); popup.hide(); } } }); Button closeButton = new Button(msg.file_browser_button_cancel()); closeButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { callback.onFailure(new Exception("No file Selected")); popup.hide(); } }); HorizontalPanel footer = new HorizontalPanel(); footer.add(closeButton); footer.add(selectButton); ScrollPanel scrollArea = new ScrollPanel(fileTree); scrollArea.setHeight("400px"); scrollArea.setWidth("450px"); VerticalPanel contents = new VerticalPanel(); contents.add(scrollArea); contents.add(footer); popup = new PopupPanel(false); popup.setStylePrimaryName("fileBrowserPopup"); popup.setStyleName("gwt-DialogBox", true); popup.setStyleName("Top", true); popup.setGlassEnabled(true); popup.setTitle(msg.file_browser_title()); popup.setWidget(contents); } private void closeItems(String exceptThis) { int size = openItems.size(); for (int i = 0; i < size; i++) { FileTreeItem current = openItems.remove(); if (!exceptThis.startsWith(current.filePath())) current.setState(false); else openItems.add(current); } } private void growTree(final FileTreeItem item){ growTree(item, item.filePath()); item.hasBeenExpanded = true; } private void growTree(final HasTreeItems root, String filePath) { if (fileSystem == null) { fileSystem = OneSwarmRPCClient.getService(); } if(root instanceof FileTreeItem) if(((FileTreeItem) root).fileStatus() == FileInfo.FileStatusFlag.NO_READ_PERMISSION){ root.removeItems(); root.addItem(new FileTreeItem(msg.file_browser_label_unreadable_directory())); ((FileTreeItem) root).setState(true); return; } if(root instanceof FileTreeItem) if(((FileTreeItem) root).fileStatus() == FileInfo.FileStatusFlag.NO_READ_PERMISSION){ root.addItem(new FileTreeItem(msg.file_browser_label_unreadable_directory())); ((FileTreeItem) root).setState(true); } fileSystem.listFiles(session, filePath, new AsyncCallback<FileInfo[]>() { public void onFailure(Throwable caught) { callback.onFailure(caught); } public void onSuccess(FileInfo[] result) { root.removeItems(); if (result != null) { if(result.length == 0) root.addItem(new FileTreeItem(msg.file_browser_label_empty_directory())); else{ for (int i = 0; i < result.length; i++) { FileTreeItem temp = new FileTreeItem(result[i]); if (temp.isDirectory()) temp.addItem(new FileTreeItem(msg.file_browser_label_loading_directory())); root.addItem(temp); } } if(root instanceof FileTreeItem) ((FileTreeItem) root).setState(true); } } }); } public void show() { if (popup == null) createPopup(); popup.center(); } }