diff --git a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIFileManager.java b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIFileManager.java index e537dbd798e..77a1834ebb6 100644 --- a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIFileManager.java +++ b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIFileManager.java @@ -10,22 +10,20 @@ *******************************************************************************/ package org.eclipse.remote.internal.jsch.ui; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.filesystem.IFileStore; import org.eclipse.jface.window.Window; import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteServices; import org.eclipse.remote.ui.IRemoteUIFileManager; import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser; import org.eclipse.swt.widgets.Shell; public class JSchUIFileManager implements IRemoteUIFileManager { - private IRemoteServices services = null; private IRemoteConnection connection = null; private boolean showConnections = false; - public JSchUIFileManager(IRemoteServices services) { - this.services = services; - } - /* * (non-Javadoc) * @@ -33,8 +31,9 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * org.eclipse.ptp.remote.core.IRemoteFileManager#browseDirectory(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ + @Override public String browseDirectory(Shell shell, String message, String filterPath, int flags) { - RemoteResourceBrowser browser = new RemoteResourceBrowser(services, connection, shell, RemoteResourceBrowser.SINGLE); + RemoteResourceBrowser browser = new RemoteResourceBrowser(connection, shell, RemoteResourceBrowser.SINGLE); browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER); browser.setInitialPath(filterPath); browser.setTitle(message); @@ -43,11 +42,11 @@ public class JSchUIFileManager implements IRemoteUIFileManager { return null; } connection = browser.getConnection(); - String path = browser.getPath(); - if (path == null) { + IFileStore resource = browser.getResource(); + if (resource == null) { return null; } - return path; + return resource.toURI().getPath(); } /* @@ -57,8 +56,9 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * org.eclipse.ptp.remote.core.IRemoteFileManager#browseFile(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ + @Override public String browseFile(Shell shell, String message, String filterPath, int flags) { - RemoteResourceBrowser browser = new RemoteResourceBrowser(services, connection, shell, RemoteResourceBrowser.SINGLE); + RemoteResourceBrowser browser = new RemoteResourceBrowser(connection, shell, RemoteResourceBrowser.SINGLE); browser.setType(RemoteResourceBrowser.FILE_BROWSER); browser.setInitialPath(filterPath); browser.setTitle(message); @@ -67,11 +67,11 @@ public class JSchUIFileManager implements IRemoteUIFileManager { return null; } connection = browser.getConnection(); - String path = browser.getPath(); - if (path == null) { + IFileStore resource = browser.getResource(); + if (resource == null) { return null; } - return path; + return resource.toURI().getPath(); } /* @@ -81,8 +81,9 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * org.eclipse.ptp.remote.core.IRemoteFileManager#browseFile(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ - public String[] browseFiles(Shell shell, String message, String filterPath, int flags) { - RemoteResourceBrowser browser = new RemoteResourceBrowser(services, connection, shell, RemoteResourceBrowser.MULTI); + @Override + public List browseFiles(Shell shell, String message, String filterPath, int flags) { + RemoteResourceBrowser browser = new RemoteResourceBrowser(connection, shell, RemoteResourceBrowser.MULTI); browser.setType(RemoteResourceBrowser.FILE_BROWSER); browser.setInitialPath(filterPath); browser.setTitle(message); @@ -91,11 +92,11 @@ public class JSchUIFileManager implements IRemoteUIFileManager { return null; } connection = browser.getConnection(); - String path[] = browser.getPaths(); - if (path == null) { - return null; + List paths = new ArrayList(); + for (IFileStore store : browser.getResources()) { + paths.add(store.toURI().getPath()); } - return path; + return paths; } /* @@ -103,6 +104,7 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * * @see org.eclipse.ptp.remote.ui.IRemoteUIFileManager#getConnection() */ + @Override public IRemoteConnection getConnection() { return connection; } @@ -114,6 +116,7 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * org.eclipse.ptp.remote.ui.IRemoteUIFileManager#setConnection(org.eclipse * .ptp.remote.core.IRemoteConnection) */ + @Override public void setConnection(IRemoteConnection connection) { this.connection = connection; } @@ -124,6 +127,7 @@ public class JSchUIFileManager implements IRemoteUIFileManager { * @see * org.eclipse.ptp.remote.ui.IRemoteUIFileManager#showConnections(boolean) */ + @Override public void showConnections(boolean enable) { showConnections = enable; } diff --git a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIServices.java b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIServices.java index f189c8a92a2..4da5846584d 100644 --- a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIServices.java +++ b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIServices.java @@ -41,6 +41,7 @@ public class JSchUIServices implements IRemoteUIServices { * * @see org.eclipse.ptp.remote.ui.IRemoteUIServicesDescriptor#getId() */ + @Override public String getId() { return fServices.getId(); } @@ -50,6 +51,7 @@ public class JSchUIServices implements IRemoteUIServices { * * @see org.eclipse.ptp.remote.ui.IRemoteUIServicesDescriptor#getName() */ + @Override public String getName() { return fServices.getName(); } @@ -59,6 +61,7 @@ public class JSchUIServices implements IRemoteUIServices { * * @see org.eclipse.ptp.remote.ui.IRemoteUIServicesDescriptor#getUIConnectionManager() */ + @Override public IRemoteUIConnectionManager getUIConnectionManager() { return new JSchUIConnectionManager(fServices); } @@ -68,7 +71,8 @@ public class JSchUIServices implements IRemoteUIServices { * * @see org.eclipse.ptp.remote.ui.IRemoteUIServicesDescriptor#getUIFileManager() */ + @Override public IRemoteUIFileManager getUIFileManager() { - return new JSchUIFileManager(fServices); + return new JSchUIFileManager(); } } diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties index 259ba83df25..38d0d34c0c2 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties @@ -48,7 +48,7 @@ RemoteFileWidget_Select_File=Select File RemoteResourceBrowser_resourceTitle=Browse Resource RemoteResourceBrowser_fileTitle=Browse File RemoteResourceBrowser_directoryTitle=Browse Directory -RemoteResourceBrowser_resourceLabel=Select resource: +RemoteResourceBrowser_resourceLabel=Selected resource: RemoteResourceBrowser_fileLabel=Selected file: RemoteResourceBrowser_directoryLabel=Selected directory: RemoteResourceBrowser_connectonLabel=Connection: diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileManager.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileManager.java index b991e5761e1..d22f7bd34fe 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileManager.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileManager.java @@ -11,6 +11,8 @@ package org.eclipse.remote.internal.ui.services.local; import java.io.File; +import java.util.Arrays; +import java.util.List; import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.ui.IRemoteUIFileManager; @@ -29,6 +31,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * org.eclipse.remote.core.IRemoteFileManager#browseDirectory(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ + @Override public String browseDirectory(Shell shell, String message, String filterPath, int flags) { DirectoryDialog dialog = new DirectoryDialog(shell); dialog.setText(message); @@ -54,6 +57,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * org.eclipse.remote.core.IRemoteFileManager#browseFile(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ + @Override public String browseFile(Shell shell, String message, String filterPath, int flags) { FileDialog dialog = new FileDialog(shell, SWT.SINGLE); dialog.setText(message); @@ -79,7 +83,8 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * org.eclipse.remote.core.IRemoteFileManager#browseFile(org.eclipse * .swt.widgets.Shell, java.lang.String, java.lang.String) */ - public String[] browseFiles(Shell shell, String message, String filterPath, int flags) { + @Override + public List browseFiles(Shell shell, String message, String filterPath, int flags) { FileDialog dialog = new FileDialog(shell, SWT.MULTI); dialog.setText(message); if (filterPath != null) { @@ -94,7 +99,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { return null; } - return dialog.getFileNames(); + return Arrays.asList(dialog.getFileNames()); } /* @@ -102,6 +107,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * * @see org.eclipse.remote.ui.IRemoteUIFileManager#getConnection() */ + @Override public IRemoteConnection getConnection() { return connection; } @@ -113,6 +119,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * org.eclipse.remote.ui.IRemoteUIFileManager#setConnection(org.eclipse * .remote.core.IRemoteConnection) */ + @Override public void setConnection(IRemoteConnection connection) { this.connection = connection; } @@ -123,6 +130,7 @@ public class LocalUIFileManager implements IRemoteUIFileManager { * @see * org.eclipse.remote.ui.IRemoteUIFileManager#showConnections(boolean) */ + @Override public void showConnections(boolean enable) { // Not implemented } diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileManager.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileManager.java index afffbf7d8f0..67e5c334fbb 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileManager.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileManager.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.remote.ui; +import java.util.List; + import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.swt.widgets.Shell; @@ -60,7 +62,7 @@ public interface IRemoteUIFileManager { public String browseFile(Shell shell, String message, String initialPath, int flags); /** - * Browse for a set of remote files. The return value is an array of paths + * Browse for a set of remote files. The return value is a list of paths * of the files on the remote system. * * Equivalent to {@link org.eclipse.swt.widgets.FileDialog}. @@ -74,10 +76,10 @@ public interface IRemoteUIFileManager { * @param flags * options settings for dialog (@see IRemoteUIConstants) * valid values are NONE, SAVE, or OPEN (@see IRemoteUIConstants) - * @return the path to the file relative to the remote system or null if the + * @return list of paths to the files relative to the remote system or null if the * browser was cancelled */ - public String[] browseFiles(Shell shell, String message, String initialPath, int flags); + public List browseFiles(Shell shell, String message, String initialPath, int flags); /** * Get the last connection that was selected in the browser. diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java index 2b9014c90a7..78131f2d3df 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java @@ -10,17 +10,25 @@ *******************************************************************************/ 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.IRemoteServices; 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.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -34,7 +42,7 @@ import org.eclipse.swt.widgets.Shell; * @author greg * */ -public class RemoteResourceBrowser extends Dialog { +public class RemoteResourceBrowser extends Dialog implements IRunnableContext { public final static String EMPTY_STRING = ""; //$NON-NLS-1$ public final static int FILE_BROWSER = 0x01; public final static int DIRECTORY_BROWSER = 0x02; @@ -44,7 +52,8 @@ public class RemoteResourceBrowser extends Dialog { private final static int widthHint = 400; private Button okButton; - private RemoteResourceBrowserWidget fWidget; + private RemoteResourceBrowserWidget fResourceBrowserWidget; + private ProgressMonitorPart fProgressMonitor; private int browserType; private String dialogTitle; @@ -54,7 +63,7 @@ public class RemoteResourceBrowser extends Dialog { private final IRemoteConnection fConnection; private int optionFlags = SINGLE; - public RemoteResourceBrowser(IRemoteServices services, IRemoteConnection conn, Shell parent, int flags) { + public RemoteResourceBrowser(IRemoteConnection conn, Shell parent, int flags) { super(parent); setShellStyle(SWT.RESIZE | getShellStyle()); fConnection = conn; @@ -66,6 +75,10 @@ public class RemoteResourceBrowser extends Dialog { setType(FILE_BROWSER); } + public RemoteResourceBrowser(Shell parent, int flags) { + this(null, parent, flags); + } + /* * (non-Javadoc) * @@ -94,10 +107,10 @@ public class RemoteResourceBrowser extends Dialog { Control contents = super.createContents(parent); setTitle(dialogTitle); if (!showConnections) { - fWidget.setConnection(fConnection); + fResourceBrowserWidget.setConnection(fConnection); } if (fInitialPath != null) { - fWidget.setInitialPath(fInitialPath); + fResourceBrowserWidget.setInitialPath(fInitialPath); } updateDialog(); return contents; @@ -113,7 +126,7 @@ public class RemoteResourceBrowser extends Dialog { @Override protected Control createDialogArea(Composite parent) { Composite main = (Composite) super.createDialogArea(parent); - GridData gd = new GridData(SWT.FILL, SWT.TOP, true, true); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.widthHint = widthHint; main.setLayoutData(gd); main.setLayout(new GridLayout(1, true)); @@ -130,14 +143,14 @@ public class RemoteResourceBrowser extends Dialog { style = SWT.MULTI; } - fWidget = new RemoteResourceBrowserWidget(main, style, options); - fWidget.addModifyListener(new ModifyListener() { + fResourceBrowserWidget = new RemoteResourceBrowserWidget(main, style, options); + fResourceBrowserWidget.addSelectionChangedListener(new ISelectionChangedListener() { @Override - public void modifyText(ModifyEvent e) { + public void selectionChanged(SelectionChangedEvent event) { updateDialog(); } }); - fWidget.addFocusListener(new FocusListener() { + fResourceBrowserWidget.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { getShell().setDefaultButton(null); // allow text widget to receive SWT.DefaultSelection event @@ -148,7 +161,21 @@ public class RemoteResourceBrowser extends Dialog { getShell().setDefaultButton(okButton); } }); - fWidget.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); + fResourceBrowserWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + 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; } @@ -159,34 +186,52 @@ public class RemoteResourceBrowser extends Dialog { * @return selected connection */ public IRemoteConnection getConnection() { - if (fWidget != null) { - return fWidget.getConnection(); + if (fResourceBrowserWidget != null) { + return fResourceBrowserWidget.getConnection(); } return null; } /** - * Get the path that was selected. + * Get the resources that was selected. * - * @return selected path + * @return selected resource or null if no resource is selected */ - public String getPath() { - if (fWidget != null && fWidget.getPaths().size() > 0) { - return fWidget.getPaths().get(0); + public IFileStore getResource() { + if (fResourceBrowserWidget != null && fResourceBrowserWidget.getResources().size() > 0) { + return fResourceBrowserWidget.getResources().get(0); } return null; } /** - * Get the paths that were selected. + * Get the resources that were selected. * - * @return selected paths + * @return selected resources */ - public String[] getPaths() { - if (fWidget != null) { - return fWidget.getPaths().toArray(new String[0]); + public List getResources() { + if (fResourceBrowserWidget != null) { + return fResourceBrowserWidget.getResources(); + } + return new ArrayList(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) + */ + @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); } - return null; } /** @@ -241,8 +286,7 @@ public class RemoteResourceBrowser extends Dialog { private void updateDialog() { if (okButton != null) { - String path = getPath(); - okButton.setEnabled(getConnection() != null && path != null && !path.equals(EMPTY_STRING)); + okButton.setEnabled(getConnection() != null && getResource() != null); } } } diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java index b7ddb410938..a058268b2b7 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java @@ -92,12 +92,14 @@ public class RemoteConnectionWidget extends Composite { listenerEnabled = enabled; } + @Override public void widgetDefaultSelected(SelectionEvent e) { if (isEnabled()) { widgetSelected(e); } } + @Override public void widgetSelected(SelectionEvent e) { if (isEnabled()) { Object source = e.getSource(); @@ -150,6 +152,22 @@ public class RemoteConnectionWidget extends Composite { private final ListenerList fSelectionListeners = new ListenerList(); private final WidgetListener fWidgetListener = new WidgetListener(); + /** + * Constructor + * + * @param parent + * parent composite + * @param style + * style or SWT.NONE + * @param title + * if a title is supplied then the widget will be placed in a group. Can be null. + * @param flags + * a combination of flags that modify the behavior of the widget. + */ + public RemoteConnectionWidget(Composite parent, int style, String title, int flags) { + this(parent, style, title, flags, null); + } + /** * Constructor * @@ -163,7 +181,6 @@ public class RemoteConnectionWidget extends Composite { * a combination of flags that modify the behavior of the widget. * @param context * runnable context, or null - * @since 7.0 */ public RemoteConnectionWidget(Composite parent, int style, String title, int flags, IRunnableContext context) { super(parent, style); diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java index ce053d0d803..ffa40a3d7b5 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java @@ -23,6 +23,8 @@ import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; @@ -48,8 +50,6 @@ import org.eclipse.remote.internal.ui.messages.Messages; import org.eclipse.remote.ui.IRemoteUIConnectionManager; import org.eclipse.remote.ui.RemoteUIServices; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -59,7 +59,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.model.WorkbenchLabelProvider; /** @@ -90,8 +89,6 @@ public class RemoteResourceBrowserWidget extends Composite { */ public static final int SHOW_CONNECTIONS = 0x40; - private static final String EMPTY_STRING = ""; //$NON-NLS-1$ - private static final int minimumWidth = 200; private static final int heightHint = 300; @@ -105,16 +102,18 @@ public class RemoteResourceBrowserWidget extends Composite { private String dialogLabel; private boolean showHidden; - private final List remotePaths = new ArrayList(); + private final List fResources = new ArrayList(); private String fInitialPath; private IPath fRootPath; private IRemoteFileManager fFileMgr; private IRemoteConnection fConnection; - private final ListenerList fModifyListeners = new ListenerList(); + private final ListenerList fSelectionListeners = new ListenerList(); private int optionFlags = FILE_BROWSER | SHOW_HIDDEN_CHECKBOX | SHOW_NEW_FOLDER_BUTTON; + private IRunnableContext fRunnableContext; + public RemoteResourceBrowserWidget(Composite parent, int style, int flags) { super(parent, style); setTitle(Messages.RemoteResourceBrowser_resourceTitle); @@ -131,20 +130,26 @@ public class RemoteResourceBrowserWidget extends Composite { setLayout(layout); final Composite mainComp = new Composite(this, SWT.NONE); - mainComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); + mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); layout = new GridLayout(); layout.numColumns = 4; mainComp.setLayout(layout); if ((optionFlags & SHOW_CONNECTIONS) != 0) { fRemoteConnectionWidget = new RemoteConnectionWidget(mainComp, SWT.NONE, null, - RemoteConnectionWidget.FLAG_NO_LOCAL_SELECTION, null); + RemoteConnectionWidget.FLAG_NO_LOCAL_SELECTION); fRemoteConnectionWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 4, 1)); fRemoteConnectionWidget.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { connectionSelected(); updateEnablement(); + notifySelectionChangedListeners(new SelectionChangedEvent(treeViewer, new ISelection() { + @Override + public boolean isEmpty() { + return true; + } + })); } }); } @@ -154,25 +159,12 @@ public class RemoteResourceBrowserWidget extends Composite { label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); remotePathText = new Text(mainComp, SWT.BORDER | SWT.SINGLE); - remotePathText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - if (remotePaths.size() == 0) { - remotePaths.add(remotePathText.getText()); - } else { - remotePaths.set(0, remotePathText.getText()); - } - notifyListeners(e); - updateEnablement(); - } - }); remotePathText.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { remotePathText.setSelection(remotePathText.getText().length()); setRoot(remotePathText.getText()); } - }); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); gd.minimumWidth = minimumWidth; @@ -261,7 +253,7 @@ public class RemoteResourceBrowserWidget extends Composite { // see bug 158380 gd.heightHint = Math.max(parent.getSize().y, heightHint); treeViewer.getTree().setLayoutData(gd); - // treeViewer.setUseHashlookup(true); + treeViewer.setUseHashlookup(true); treeViewer.setComparer(new DeferredFileStoreComparer()); treeViewer.setComparator(new RemoteResourceComparator()); treeViewer.setContentProvider(new RemoteContentProvider()); @@ -272,17 +264,18 @@ public class RemoteResourceBrowserWidget extends Composite { ISelection selection = event.getSelection(); if (!selection.isEmpty() && selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; - remotePaths.clear(); + fResources.clear(); for (Object currentSelection : ss.toArray()) { if (currentSelection instanceof DeferredFileStore) { - String path = ((DeferredFileStore) currentSelection).getFileStore().toURI().getPath(); - remotePaths.add(path); + IFileStore store = ((DeferredFileStore) currentSelection).getFileStore(); + fResources.add(store); } } - if (remotePaths.size() > 0) { - remotePathText.setText(remotePaths.get(0)); + if (fResources.size() > 0) { + remotePathText.setText(fResources.get(0).toURI().getPath()); } updateEnablement(); + notifySelectionChangedListeners(event); } } }); @@ -326,13 +319,13 @@ public class RemoteResourceBrowserWidget extends Composite { } /** - * Add a listener that will be notified when the directory path is modified. + * Add a listener that will be notified when the selection is changed. * * @param listener * listener to add */ - public void addModifyListener(ModifyListener listener) { - fModifyListeners.add(listener); + public void addSelectionChangedListener(ISelectionChangedListener listener) { + fSelectionListeners.add(listener); } /** @@ -348,7 +341,7 @@ public class RemoteResourceBrowserWidget extends Composite { } IRemoteUIConnectionManager uiMgr = RemoteUIServices.getRemoteUIServices(conn.getRemoteServices()).getUIConnectionManager(); if (uiMgr != null) { - uiMgr.openConnectionWithProgress(getShell(), null, conn); + uiMgr.openConnectionWithProgress(getShell(), getRunnableContext(), conn); } if (!conn.isOpen()) { return false; @@ -374,11 +367,6 @@ public class RemoteResourceBrowserWidget extends Composite { return false; } - public void setConnection(IRemoteConnection connection) { - changeInput(connection); - updateEnablement(); - } - /** * When a new connection is selected, make sure it is open before using it. */ @@ -403,7 +391,7 @@ public class RemoteResourceBrowserWidget extends Composite { final String[] name = new String[1]; name[0] = null; try { - PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() { + IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) { SubMonitor progress = SubMonitor.convert(monitor, 10); @@ -425,13 +413,12 @@ public class RemoteResourceBrowserWidget extends Composite { Messages.RemoteResourceBrowserWidget_Unable_to_create_new_folder, e.getStatus()); } } - }); + }; + getRunnableContext().run(true, true, runnable); } catch (InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + // Ignore, return null } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + // Ignore, return null } return name[0]; } @@ -468,29 +455,40 @@ public class RemoteResourceBrowserWidget extends Composite { } /** - * Get the paths that were selected. + * Get the resources that were selected. * - * @return selected paths + * @return selected resources */ - public List getPaths() { - return remotePaths; + public List getResources() { + return fResources; } - private void notifyListeners(ModifyEvent e) { - for (Object listener : fModifyListeners.getListeners()) { - ((ModifyListener) listener).modifyText(e); + public IRunnableContext getRunnableContext() { + if (fRunnableContext == null) { + return new ProgressMonitorDialog(getShell()); + } + return fRunnableContext; + } + + private void notifySelectionChangedListeners(SelectionChangedEvent e) { + for (Object listener : fSelectionListeners.getListeners()) { + ((ISelectionChangedListener) listener).selectionChanged(e); } } /** - * Remove a listener that will be notified when the directory path is - * modified. + * Remove a listener that will be notified when the selection is changed * * @param listener * listener to remove */ - public void removeModifyListener(ModifyListener listener) { - fModifyListeners.remove(listener); + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + fSelectionListeners.remove(listener); + } + + public void setConnection(IRemoteConnection connection) { + changeInput(connection); + updateEnablement(); } /** @@ -518,10 +516,16 @@ public class RemoteResourceBrowserWidget extends Composite { treeViewer.setInput(new DeferredFileStore(root, !showHidden)); remotePathText.setText(path); remotePathText.setSelection(remotePathText.getText().length()); + fResources.clear(); + fResources.add(root); fRootPath = new Path(path); } } + public void setRunnableContext(IRunnableContext context) { + fRunnableContext = context; + } + /** * Set the dialogTitle of the dialog. * @@ -540,16 +544,20 @@ public class RemoteResourceBrowserWidget extends Composite { /** * Set the type of browser. Can be either a file browser (allows selection - * of files) or a directory browser (allows selection of directories), or - * both. + * of files only) or a directory browser (allows selection of directories only), or + * both files and directories. */ public void setType() { - if ((optionFlags & FILE_BROWSER) == FILE_BROWSER) { + if ((optionFlags & DIRECTORY_BROWSER) == 0) { dialogLabel = Messages.RemoteResourceBrowser_fileLabel; setTitle(Messages.RemoteResourceBrowser_fileTitle); - } else { + } else if ((optionFlags & FILE_BROWSER) == 0) { dialogLabel = Messages.RemoteResourceBrowser_directoryLabel; setTitle(Messages.RemoteResourceBrowser_directoryTitle); + } else { + dialogLabel = Messages.RemoteResourceBrowser_resourceLabel; + setTitle(Messages.RemoteResourceBrowser_resourceTitle); + } } @@ -558,16 +566,17 @@ public class RemoteResourceBrowserWidget extends Composite { boolean newFolderEnabled = false; if (fConnection != null && fConnection.isOpen()) { - if (remotePaths.size() == 1) { - String pathText = remotePaths.get(0); - if (!pathText.equals(EMPTY_STRING)) { - if (fConnection.getFileManager().getResource(pathText).fetchInfo().isDirectory()) { - newFolderEnabled = true; - } - IPath path = new Path(pathText); - if (!path.isRoot()) { - upEnabled = true; - } + if (fResources.size() == 1) { + IFileStore store = fResources.get(0); + /* + * Assume that we have already called fetchInfo() on the file store, so this should + * effectively be a noop. + */ + if (store.fetchInfo().isDirectory()) { + newFolderEnabled = true; + } + if (store.getParent() != null) { + upEnabled = true; } } }