/* * FileBrowserWidget.java * * Copyright (C) 2009-15 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.core.client.files.filedialog; import org.rstudio.core.client.FocusTransitionManager; import org.rstudio.core.client.events.SelectionCommitHandler; import org.rstudio.core.client.files.FileSystemContext; import org.rstudio.core.client.files.FileSystemItem; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; public class FileBrowserWidget extends Composite implements FileSystemContext.Callbacks { public interface Host extends SelectionCommitHandler<FileSystemItem>, SelectionHandler<FileSystemItem> { String getFilenameLabel(); void onError(String errorMessage); void maybeAccept(); FileSystemItem[] ls(); } public FileBrowserWidget(FileSystemContext context, Host host) { context_ = context; host_ = host; breadcrumb_ = new PathBreadcrumbWidget(context_); breadcrumb_.addSelectionCommitHandler(host); directory_ = new DirectoryContentsWidget(context_); directory_.addSelectionHandler(host); directory_.addSelectionCommitHandler(host); directory_.showProgress(true); DockPanel dockPanel = new DockPanel(); Widget topWidget = createTopWidget(); if (topWidget != null) dockPanel.add(topWidget, DockPanel.NORTH); dockPanel.add(breadcrumb_, DockPanel.NORTH); dockPanel.add(directory_, DockPanel.CENTER); initWidget(dockPanel); } // Public methods ---------------------------------------------------------- public void setFilename(String filename) { if (filename_ != null) filename_.setText(filename); else initialFilename_ = filename; } public String getFilename() { return filename_.getText(); } public void setFilenameEnabled(boolean enabled) { filename_.setEnabled(enabled); } public void selectFilename() { filename_.selectAll(); } public void setFilenameFocus(boolean focus) { filename_.setFocus(focus); } public Style getFilenameStyle() { return filename_.getElement().getStyle(); } public void onNavigated() { String dir = context_.pwd(); final FileSystemItem[] parsedDir = context_.parseDir(dir); breadcrumb_.setDirectory(parsedDir, null); directory_.setContents( host_.ls(), parsedDir.length > 1 ? parsedDir[parsedDir.length-2] : null); setDirectoryFocus(true); } public void cd(String path) { directory_.clearContents(); directory_.showProgress(true); context_.cd(path); } public void cd(FileSystemItem dir) { assert dir.isDirectory(); cd(dir.getPath()); } public void addKeyUpHandler(KeyUpHandler handler) { filename_.addKeyUpHandler(handler); } public void addKeyPressHandler(KeyPressHandler handler) { filename_.addKeyPressHandler(handler); } public void setSelectedRow(Integer row) { directory_.setSelectedRow(row); } public void setDirectoryFocus(boolean focus) { directory_.setFocus(focus); } @Override public void onError(String errorMessage) { onNavigated(); } @Override public void onDirectoryCreated(FileSystemItem directory) { directory_.addDirectory(directory); } public String getSelectedValue() { return directory_.getSelectedValue(); } public FileSystemItem getSelectedItem() { return directory_.getSelectedItem(); } public FileSystemItem getCurrentDirectory() { return context_.pwdItem(); } // Private methods --------------------------------------------------------- private Widget createTopWidget() { String nameLabel = host_.getFilenameLabel(); if (nameLabel == null) return null; HorizontalPanel filenamePanel = new HorizontalPanel(); FileDialogStyles styles = FileDialogResources.INSTANCE.styles(); filenamePanel.setStylePrimaryName(styles.filenamePanel()); filenamePanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); Label filenameLabel = new Label(nameLabel + ":", false); filenameLabel.setStylePrimaryName(styles.filenameLabel()); filenamePanel.add(filenameLabel); filename_ = new TextBox(); if (initialFilename_ != null) filename_.setText(initialFilename_); filename_.setStylePrimaryName(styles.filename()); filenamePanel.add(filename_); filenamePanel.setCellWidth(filename_, "100%"); ftm_ = new FocusTransitionManager(); ftm_.add(filename_, directory_); return filenamePanel; } private PathBreadcrumbWidget breadcrumb_; private DirectoryContentsWidget directory_; private TextBox filename_; private FileSystemContext context_; private String initialFilename_; private Host host_; private FocusTransitionManager ftm_; }