blob: ec0e1423be40d1c5da7a9132fbce7ba8c7850f73 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008,2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.remote.ui.dialogs;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.ProgressMonitorPart;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteFileService;
import org.eclipse.remote.internal.ui.messages.Messages;
import org.eclipse.remote.ui.widgets.RemoteResourceBrowserWidget;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* Generic file/directory browser for remote resources.
*
* A directory browser (DIRECTORY_BROWSER) only allows selection of directories.
* A file browser (FILE_BROWSER) allows selection of files and directories, but the ok button is only enabled when a file is
* selected.
* A resource browser (FILE_BROWSER|DIRECTORY_BROWSER) allows selection of files and directories. This is the default.
*
* To select multiple resources, set the style to SWT.MULTI.
*
* @author greg
*
*/
public class RemoteResourceBrowser extends Dialog implements IRunnableContext {
public static final String EMPTY_STRING = ""; //$NON-NLS-1$
public static final int FILE_BROWSER = 0x01;
public static final int DIRECTORY_BROWSER = 0x02;
private final static int widthHint = 400;
private Button fOkButton;
private RemoteResourceBrowserWidget fResourceBrowserWidget;
private ProgressMonitorPart fProgressMonitor;
private int fBrowserType;
private String fDialogTitle;
private boolean fShowHiddenCheckbox = true;
private boolean fShowNewFolderButton = true;
private boolean fShowConnections = false;
private boolean fShowLocalSelection = false;
private String fInitialPath;
private IRemoteConnection fConnection;
private int fBrowserStyle = SWT.SINGLE;
public RemoteResourceBrowser(Shell parent, int style) {
super(parent);
setShellStyle(SWT.RESIZE | getShellStyle());
if (style != SWT.NONE) {
fBrowserStyle = style;
}
setTitle(Messages.RemoteResourceBrowser_resourceTitle);
setType(FILE_BROWSER | DIRECTORY_BROWSER);
}
@Override
protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
Button button = super.createButton(parent, id, label, defaultButton);
if (id == IDialogConstants.OK_ID) {
fOkButton = button;
}
return button;
}
@Override
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
if (fDialogTitle == null) {
if (fBrowserType == DIRECTORY_BROWSER) {
setTitle(Messages.RemoteResourceBrowser_directoryTitle);
} else if (fBrowserType == FILE_BROWSER) {
setTitle(Messages.RemoteResourceBrowser_fileTitle);
}
} else {
setTitle(fDialogTitle);
}
if (fInitialPath != null) {
fResourceBrowserWidget.setInitialPath(fInitialPath);
}
if (fConnection != null) {
fResourceBrowserWidget.setConnection(fConnection);
}
updateDialog();
return contents;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite main = (Composite) super.createDialogArea(parent);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = widthHint;
main.setLayoutData(gd);
main.setLayout(new GridLayout(1, true));
int options = 0;
if (fConnection == null || fShowConnections) {
options |= RemoteResourceBrowserWidget.SHOW_CONNECTIONS;
}
if (fBrowserType == DIRECTORY_BROWSER) {
options |= RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
} else if (fBrowserType == FILE_BROWSER) {
options |= RemoteResourceBrowserWidget.FILE_BROWSER;
} else {
options |= RemoteResourceBrowserWidget.FILE_BROWSER | RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
}
if (fShowHiddenCheckbox) {
options |= RemoteResourceBrowserWidget.SHOW_HIDDEN_CHECKBOX;
}
if (fShowNewFolderButton) {
options |= RemoteResourceBrowserWidget.SHOW_NEW_FOLDER_BUTTON;
}
if (fShowLocalSelection) {
options |= RemoteResourceBrowserWidget.SHOW_LOCAL_SELECTION;
}
fResourceBrowserWidget = new RemoteResourceBrowserWidget(main, fBrowserStyle, options);
fResourceBrowserWidget.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateDialog();
}
});
fResourceBrowserWidget.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
getShell().setDefaultButton(null); // allow text widget to receive SWT.DefaultSelection event
}
@Override
public void focusLost(FocusEvent e) {
getShell().setDefaultButton(fOkButton);
}
});
fResourceBrowserWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
if (fConnection != null) {
fResourceBrowserWidget.setConnection(fConnection);
}
Composite monitorComposite = new Composite(main, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 2;
monitorComposite.setLayout(layout);
monitorComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fProgressMonitor = new ProgressMonitorPart(monitorComposite, new GridLayout(), true);
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
fProgressMonitor.setLayoutData(gridData);
monitorComposite.setVisible(false);
fResourceBrowserWidget.setRunnableContext(this);
return main;
}
/**
* Get the connection that was selected
*
* @return selected connection
*/
public IRemoteConnection getConnection() {
if (fResourceBrowserWidget != null) {
return fResourceBrowserWidget.getConnection();
}
return null;
}
/**
* Get the resources that was selected.
*
* @return selected resource or null if no resource is selected
*/
public IFileStore getResource() {
if (fResourceBrowserWidget != null) {
return fResourceBrowserWidget.getResource();
}
return null;
}
/**
* Get the resources that were selected.
*
* @return selected resources
*/
public List<IFileStore> getResources() {
if (fResourceBrowserWidget != null) {
return fResourceBrowserWidget.getResources();
}
return new ArrayList<IFileStore>();
}
@Override
public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException,
InterruptedException {
fProgressMonitor.attachToCancelComponent(null);
fProgressMonitor.getParent().setVisible(true);
try {
ModalContext.run(runnable, fork, fProgressMonitor, getShell().getDisplay());
} finally {
fProgressMonitor.getParent().setVisible(false);
fProgressMonitor.removeFromCancelComponent(null);
}
}
/**
* Set the connection for the browser. The connection must support the IRemoteFileService service or this method will have no
* effect.
*
* @param connection
* connection that supports the IRemoteFileService service
*/
public void setConnection(IRemoteConnection connection) {
if (connection != null && connection.hasService(IRemoteFileService.class)) {
fConnection = connection;
}
}
/**
* Set the initial path to start browsing. This will be set in the browser
* text field, and in a future version should expand the browser to this
* location if it exists.
*
* @param path initial path
*/
public void setInitialPath(String path) {
fInitialPath = path;
}
/**
* Set the fDialogTitle of the dialog.
*
* @param title title to display
*/
public void setTitle(String title) {
fDialogTitle = title;
if (fDialogTitle == null) {
fDialogTitle = ""; //$NON-NLS-1$
}
Shell shell = getShell();
if ((shell != null) && !shell.isDisposed()) {
shell.setText(fDialogTitle);
}
}
/**
* Set the type of browser. Can be either a file browser (allows selection
* of files), a directory browser (allows selection of directories), or
* a resource browser (allows selection of files and directories).
*/
public void setType(int type) {
fBrowserType = type;
}
/**
* Show available connections on browser if possible (default disabled).
*
* @param enable enable connection display if true
*/
public void showConnections(boolean enable) {
fShowConnections = enable;
}
/**
* Enable a checkbox to show hidden files (default enabled)
*
* @param showHidden show hidden files if true
*/
public void showHiddenCheckbox(boolean showHidden) {
fShowHiddenCheckbox = showHidden;
}
/**
* Enable selection of local files
*
* @param showLocalSelection show local files if true
*/
public void showLocalSelection(boolean showLocalSelection) {
fShowLocalSelection = showLocalSelection;
}
/**
* Enable a button to create new folders (default enabled)
*
* @param showNewFolderButton show new folder button if true
*/
public void showNewFolderButton(boolean showNewFolderButton) {
fShowNewFolderButton = showNewFolderButton;
}
private void updateDialog() {
if (fOkButton != null) {
IFileStore resource = getResource();
boolean enabled = getConnection() != null && resource != null;
if (enabled && fBrowserType == FILE_BROWSER) {
enabled &= !resource.fetchInfo().isDirectory();
}
fOkButton.setEnabled(enabled);
}
}
}