/**
* This file Copyright (c) 2005-2010 Aptana, Inc. This program is
* dual-licensed under both the Aptana Public License and the GNU General
* Public license. You may elect to use one or the other of these licenses.
*
* This program is distributed in the hope that it will be useful, but
* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
* NONINFRINGEMENT. Redistribution, except as permitted by whichever of
* the GPL or APL you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or modify this
* program under the terms of the GNU General Public License,
* Version 3, as published by the Free Software Foundation. You should
* have received a copy of the GNU General Public License, Version 3 along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Aptana provides a special exception to allow redistribution of this file
* with certain other free and open source software ("FOSS") code and certain additional terms
* pursuant to Section 7 of the GPL. You may view the exception and these
* terms on the web at http://www.aptana.com/legal/gpl/.
*
* 2. For the Aptana Public License (APL), this program and the
* accompanying materials are made available under the terms of the APL
* v1.0 which accompanies this distribution, and is available at
* http://www.aptana.com/legal/apl/.
*
* You may view the GPL, Aptana's exception and additional terms, and the
* APL in the file titled license.html at the root of the corresponding
* plugin containing this source file.
*
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.ui.ftp.dialogs;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.Arrays;
import java.util.regex.Pattern;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.ProgressMonitorPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import com.aptana.ide.core.CoreStrings;
import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.io.ConnectionContext;
import com.aptana.ide.core.io.ConnectionPointType;
import com.aptana.ide.core.io.CoreIOPlugin;
import com.aptana.ide.core.io.IBaseRemoteConnectionPoint;
import com.aptana.ide.core.io.IConnectionPoint;
import com.aptana.ide.core.ui.PixelConverter;
import com.aptana.ide.filesystem.ftp.IBaseFTPConnectionPoint;
import com.aptana.ide.filesystem.ftp.IFTPConstants;
import com.aptana.ide.filesystem.ftp.Policy;
import com.aptana.ide.ui.IPropertyDialog;
import com.aptana.ide.ui.ftp.Activator;
import com.aptana.ide.ui.ftp.internal.FTPAdvancedOptionsComposite;
import com.aptana.ide.ui.ftp.internal.IConnectionDialog;
import com.aptana.ide.ui.ftp.internal.IConnectionRunnable;
import com.aptana.ide.ui.ftp.internal.IOptionsComposite;
import com.aptana.ide.ui.io.FileSystemUtils;
import com.aptana.ide.ui.io.dialogs.FileTreeSelectionDialog;
import com.aptana.ide.ui.io.dialogs.IDialogConstants;
/**
* @author Max Stepanov
*
*/
public class FTPConnectionPointPropertyDialog extends TitleAreaDialog implements IPropertyDialog, IConnectionDialog {
private static final String DEFAULT_NAME = Messages.FTPConnectionPointPropertyDialog_Title;
private static final Pattern HOST_PATTERN = Pattern.compile("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|([-\\w]+(\\.[-\\w]+)*)$"); //$NON-NLS-1$
protected IBaseRemoteConnectionPoint ftpConnectionPoint;
protected IBaseRemoteConnectionPoint originalFtpConnectionPoint;
private boolean isNew = false;
private Text nameText;
private Text hostText;
private Text remotePathText;
private Combo loginCombo;
protected Label passwordLabel;
protected Text passwordText;
protected Button savePasswordButton;
private Button testButton;
private Button browseButton;
protected ExpandableComposite optionsExpandable;
protected IOptionsComposite advancedOptions;
private ProgressMonitorPart progressMonitorPart;
private boolean lockedUI;
private boolean connectionTested;
private ModifyListener modifyListener;
private SelectionListener selectionListener;
private Image titleImage;
protected Font smallFont;
/**
* @param parentShell
*/
public FTPConnectionPointPropertyDialog(Shell parentShell) {
super(parentShell);
}
/* (non-Javadoc)
* @see com.aptana.ide.core.io.ui.IPropertyDialog#setPropertyElement(java.lang.Object)
*/
public void setPropertySource(Object element) {
ftpConnectionPoint = null;
if (element instanceof IBaseRemoteConnectionPoint) {
ftpConnectionPoint = (IBaseRemoteConnectionPoint) element;
}
}
/* (non-Javadoc)
* @see com.aptana.ide.ui.IPropertyDialog#getPropertySource()
*/
public Object getPropertySource() {
return ftpConnectionPoint;
}
protected ConnectionPointType getConnectionPointType() {
if (ftpConnectionPoint != null) {
return CoreIOPlugin.getConnectionPointManager().getType(ftpConnectionPoint);
}
return CoreIOPlugin.getConnectionPointManager().getType(IBaseFTPConnectionPoint.TYPE_FTP);
}
protected void createSiteSection(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(label).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_LBL_SiteName));
nameText = new Text(parent, SWT.SINGLE | SWT.BORDER);
nameText.setLayoutData(GridDataFactory.fillDefaults()
.hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
.grab(true, false).create());
}
protected void createPasswordSection(Composite parent) {
passwordLabel = new Label(parent, SWT.NONE);
passwordLabel.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(passwordLabel).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
passwordLabel.setText(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_LBL_Password));
passwordText = new Text(parent, SWT.SINGLE | SWT.PASSWORD | SWT.BORDER);
passwordText.setLayoutData(GridDataFactory.fillDefaults()
.hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
.grab(true, false).create());
savePasswordButton = new Button(parent, SWT.CHECK);
savePasswordButton.setLayoutData(GridDataFactory.fillDefaults().create());
savePasswordButton.setText(Messages.FTPConnectionPointPropertyDialog_LBL_Save);
}
protected void createAdvancedOptions(Composite parent) {
advancedOptions = new FTPAdvancedOptionsComposite(parent, SWT.NONE, this);
((Composite) advancedOptions).setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite dialogArea = (Composite) super.createDialogArea(parent);
titleImage = Activator.getImageDescriptor("/icons/full/wizban/ftp.png").createImage(); //$NON-NLS-1$
smallFont = JFaceResources.getTextFontDescriptor().increaseHeight(-2).createFont(dialogArea.getDisplay());
dialogArea.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dispose();
}
});
setTitleImage(titleImage);
if (ftpConnectionPoint != null) {
setTitle(StringUtils.format(Messages.FTPConnectionPointPropertyDialog_MessageTitle_Edit, getConnectionPointType().getName()));
getShell().setText(Messages.FTPConnectionPointPropertyDialog_Title_Edit);
} else {
setTitle(StringUtils.format(Messages.FTPConnectionPointPropertyDialog_MessageTitle_New, getConnectionPointType().getName()));
getShell().setText(Messages.FTPConnectionPointPropertyDialog_Title_New);
}
Composite container = new Composite(dialogArea, SWT.NONE);
container.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
container.setLayout(GridLayoutFactory.swtDefaults()
.margins(convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN), convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN))
.spacing(convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING), convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING))
.numColumns(2).create());
/* row 1 */
createSiteSection(container);
Group group = new Group(container, SWT.NONE);
group.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, false).create());
group.setLayout(GridLayoutFactory.swtDefaults().numColumns(3).create());
group.setText(Messages.FTPConnectionPointPropertyDialog_LBL_GroupInfo);
/* row 2 */
Label label = new Label(group, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(label).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_LBL_Server));
hostText = new Text(group, SWT.SINGLE | SWT.BORDER);
hostText.setLayoutData(GridDataFactory.swtDefaults()
.hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
.span(2, 1).create());
/* row 3 */
new Label(group, SWT.NONE)
.setLayoutData(GridDataFactory.swtDefaults().create());
label = new Label(group, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create());
label.setFont(smallFont);
label.setText(Messages.FTPConnectionPointPropertyDialog_LBL_Example);
/* row 4 */
label = new Label(group, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(label).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_LBL_Username));
loginCombo = new Combo(group, SWT.DROP_DOWN | SWT.BORDER);
loginCombo.setLayoutData(GridDataFactory.swtDefaults()
.hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
.grab(true, false).create());
loginCombo.add(IFTPConstants.LOGIN_ANONYMOUS);
testButton = new Button(group, SWT.PUSH);
testButton.setText(Messages.FTPConnectionPointPropertyDialog_LBL_Test);
testButton.setLayoutData(GridDataFactory.fillDefaults().hint(
Math.max(
new PixelConverter(testButton).convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH),
testButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x
), SWT.DEFAULT).create());
/* row 5 */
createPasswordSection(group);
/* row 6 */
label = new Label(group, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(label).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_LBL_RemotePath));
remotePathText = new Text(group, SWT.SINGLE | SWT.BORDER);
remotePathText.setLayoutData(GridDataFactory.swtDefaults()
.hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
.grab(true, false).create());
browseButton = new Button(group, SWT.PUSH);
browseButton.setText('&'+StringUtils.ellipsify(CoreStrings.BROWSE));
browseButton.setLayoutData(GridDataFactory.fillDefaults().hint(
Math.max(
new PixelConverter(browseButton).convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH),
browseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x
), SWT.DEFAULT).create());
/* row 7 */
optionsExpandable = new ExpandableComposite(container, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.FOCUS_TITLE);
optionsExpandable.setText(Messages.FTPConnectionPointPropertyDialog_LBL_Options);
optionsExpandable.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create());
Group optionsGroup = new Group(optionsExpandable, SWT.NONE);
optionsGroup.setLayout(GridLayoutFactory.fillDefaults().create());
createAdvancedOptions(optionsGroup);
optionsExpandable.setClient(optionsGroup);
optionsExpandable.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
layoutShell();
}
});
/* row 8 */
progressMonitorPart = new ProgressMonitorPart(container, GridLayoutFactory.fillDefaults().create());
progressMonitorPart.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).exclude(true).span(2, 1).create());
/* -- */
addListeners();
passwordText.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
e.doit = false;
testConnection();
}
});
testButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (testConnection()) {
MessageDialog.openInformation(getShell(),
Messages.FTPConnectionPointPropertyDialog_Succeed_Title,
StringUtils.format(
Messages.FTPConnectionPointPropertyDialog_Succeed_Message,
hostText.getText()));
}
}
});
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
browseConnection();
}
});
if (ftpConnectionPoint == null) {
isNew = true;
ftpConnectionPoint = getOrCreateConnectionPoint(getConnectionPointType());
ftpConnectionPoint.setName(DEFAULT_NAME);
} else {
originalFtpConnectionPoint = ftpConnectionPoint;
}
loadPropertiesFrom(ftpConnectionPoint);
connectionTested = !isNew;
return dialogArea;
}
protected IBaseRemoteConnectionPoint getOrCreateConnectionPoint(ConnectionPointType connectionPointType) {
if (!isNew) {
if (CoreIOPlugin.getConnectionPointManager().getType(originalFtpConnectionPoint).equals(connectionPointType)) {
return originalFtpConnectionPoint;
}
}
try {
return (IBaseRemoteConnectionPoint) CoreIOPlugin.getConnectionPointManager()
.createConnectionPoint(connectionPointType);
} catch (CoreException e) {
IdeLog.logError(Activator.getDefault(), Messages.FTPConnectionPointPropertyDialog_ERR_FailedCreate, e);
close();
throw new SWTException();
}
}
protected void dispose() {
if (titleImage != null) {
setTitleImage(null);
titleImage.dispose();
titleImage = null;
}
if (smallFont != null) {
smallFont.dispose();
smallFont = null;
}
}
protected void addListeners() {
if (modifyListener == null) {
modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
if (e.widget != nameText) {
connectionTested = false;
}
}
};
}
nameText.addModifyListener(modifyListener);
hostText.addModifyListener(modifyListener);
loginCombo.addModifyListener(modifyListener);
passwordText.addModifyListener(modifyListener);
remotePathText.addModifyListener(modifyListener);
if (selectionListener == null) {
selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validate();
}
};
}
loginCombo.addSelectionListener(selectionListener);
}
protected void removeListeners() {
if (modifyListener != null) {
nameText.removeModifyListener(modifyListener);
hostText.removeModifyListener(modifyListener);
loginCombo.removeModifyListener(modifyListener);
passwordText.removeModifyListener(modifyListener);
remotePathText.removeModifyListener(modifyListener);
}
if (selectionListener != null) {
loginCombo.removeSelectionListener(selectionListener);
}
}
protected void layoutShell() {
Point size = getInitialSize();
Rectangle bounds = getConstrainedShellBounds(new Rectangle(0, 0, size.x, size.y));
getShell().setSize(bounds.width, bounds.height);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#canHandleShellCloseEvent()
*/
@Override
protected boolean canHandleShellCloseEvent() {
return !lockedUI && super.canHandleShellCloseEvent();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
if (!isValid()) {
return;
}
if (DEFAULT_NAME.equals(nameText.getText())) {
nameText.setText(hostText.getText());
}
if (!connectionTested) {
if (!testConnection()) {
MessageDialog dlg = new MessageDialog(getShell(),
Messages.FTPConnectionPointPropertyDialog_ConfirmTitle,
null,
Messages.FTPConnectionPointPropertyDialog_ConfirmMessage,
MessageDialog.QUESTION,
new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, Messages.FTPConnectionPointPropertyDialog_LBL_Edit },
2);
int code = dlg.open();
switch (code) {
case 1:
super.okPressed();
case 2:
return;
default:
}
}
}
CoreIOPlugin.getAuthenticationManager().setPassword(
getAuthId(ftpConnectionPoint),
passwordText.getText().toCharArray(), savePasswordButton.getSelection());
boolean changed = savePropertiesTo(ftpConnectionPoint);
if (isNew) {
CoreIOPlugin.getConnectionPointManager().addConnectionPoint(ftpConnectionPoint);
} else if (ftpConnectionPoint != originalFtpConnectionPoint) {
CoreIOPlugin.getConnectionPointManager().removeConnectionPoint(originalFtpConnectionPoint);
CoreIOPlugin.getConnectionPointManager().addConnectionPoint(ftpConnectionPoint);
} else if (changed) {
CoreIOPlugin.getConnectionPointManager().connectionPointChanged(ftpConnectionPoint);
}
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
*/
@Override
protected void cancelPressed() {
progressMonitorPart.setCanceled(true);
if (!lockedUI) {
super.cancelPressed();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
try {
return super.createContents(parent);
} finally {
validate();
}
}
protected String getAuthId(IBaseRemoteConnectionPoint connectionPoint) {
return Policy.generateAuthId(getConnectionPointType().getType().toUpperCase(), connectionPoint);
}
protected void loadPropertiesFrom(IBaseRemoteConnectionPoint connectionPoint) {
removeListeners();
try {
nameText.setText(valueOrEmpty(connectionPoint.getName()));
hostText.setText(valueOrEmpty(connectionPoint.getHost()));
remotePathText.setText(connectionPoint.getPath().toPortableString());
String login = connectionPoint.getLogin();
int index = loginCombo.indexOf(login);
if (index >= 0) {
loginCombo.select(index);
} else {
loginCombo.setText(login);
}
String authId = getAuthId(connectionPoint);
boolean persistent = CoreIOPlugin.getAuthenticationManager().hasPersistent(authId);
savePasswordButton.setSelection(persistent);
char[] password = connectionPoint.getPassword();
if (persistent && password == null) {
password = CoreIOPlugin.getAuthenticationManager().getPassword(authId);
}
if (password != null) {
passwordText.setText(String.copyValueOf(password));
}
advancedOptions.loadPropertiesFrom(connectionPoint);
} finally {
addListeners();
}
}
protected boolean savePropertiesTo(IBaseRemoteConnectionPoint connectionPoint) {
boolean updated = false;
String name = nameText.getText();
if (!name.equals(connectionPoint.getName())) {
connectionPoint.setName(name);
updated = true;
}
String host = hostText.getText();
if (!host.equals(connectionPoint.getHost())) {
connectionPoint.setHost(host);
updated = true;
}
IPath path = Path.fromPortableString(remotePathText.getText());
if (!connectionPoint.getPath().equals(path)) {
connectionPoint.setPath(path);
updated = true;
}
String login = loginCombo.getText();
if (!login.equals(connectionPoint.getLogin())) {
connectionPoint.setLogin(login);
updated = true;
}
char[] password = passwordText.getText().toCharArray();
if (!Arrays.equals(password, connectionPoint.getPassword())) {
connectionPoint.setPassword(password);
updated = true;
}
if (advancedOptions.savePropertiesTo(connectionPoint)) {
updated = true;
}
return updated;
}
public void validate() {
Button button = getButton(OK);
if (button == null) {
return;
}
boolean valid = isValid();
button.setEnabled(valid);
testButton.setEnabled(valid);
browseButton.setEnabled(valid);
advancedOptions.setValid(valid);
}
public boolean isValid() {
String message = null;
if (nameText.getText().length() == 0) {
message = Messages.FTPConnectionPointPropertyDialog_ERR_NameEmpty;
} else if (!HOST_PATTERN.matcher(hostText.getText()).matches()) {
message = Messages.FTPConnectionPointPropertyDialog_ERR_InvalidHost;
} else if (loginCombo.getText().length() == 0) {
message = Messages.FTPConnectionPointPropertyDialog_ERR_NoUsername;
} else {
message = advancedOptions.isValid();
}
setErrorMessage(message);
return (message == null);
}
private boolean testConnection() {
return testConnection(null, null);
}
/* (non-Javadoc)
* @see com.aptana.ide.ui.ftp.internal.IConnectionDialog#testConnection(com.aptana.ide.core.io.ConnectionContext, com.aptana.ide.ui.ftp.internal.IConnectionRunnable)
*/
public boolean testConnection(ConnectionContext context, final IConnectionRunnable connectRunnable) {
// WORKAROUND: getting contents after the control is disabled will return empty string if not called here
hostText.getText();
loginCombo.getText();
passwordText.getText();
remotePathText.getText();
lockUI(true);
((GridData) progressMonitorPart.getLayoutData()).exclude = false;
layoutShell();
try {
final IBaseRemoteConnectionPoint connectionPoint = isNew ? ftpConnectionPoint
: (IBaseRemoteConnectionPoint) CoreIOPlugin.getConnectionPointManager().cloneConnectionPoint(ftpConnectionPoint);
savePropertiesTo(connectionPoint);
if (context == null) {
context = new ConnectionContext();
context.setBoolean(ConnectionContext.QUICK_CONNECT, true);
}
context.setBoolean(ConnectionContext.NO_PASSWORD_PROMPT, true);
CoreIOPlugin.setConnectionContext(connectionPoint, context);
ModalContext.run(new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
try {
if (connectRunnable != null) {
connectRunnable.beforeConnect(connectionPoint);
}
connectionPoint.connect(monitor);
if (connectRunnable != null) {
connectRunnable.afterConnect(connectionPoint, monitor);
}
} finally {
try {
connectionPoint.disconnect(monitor);
} catch (CoreException e) {
IdeLog.logImportant(Activator.getDefault(), StringUtils.EMPTY, e);
}
}
} catch (CoreException e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
}, true, progressMonitorPart, getShell().getDisplay());
return connectionTested = true;
} catch (InterruptedException e) {
} catch (InvocationTargetException e) {
showErrorDialog(e.getTargetException());
} catch (CoreException e) {
showErrorDialog(e);
} finally {
if (!progressMonitorPart.isDisposed()) {
((GridData) progressMonitorPart.getLayoutData()).exclude = true;
layoutShell();
lockUI(false);
}
}
return false;
}
private void browseConnection() {
testConnection(null, new IConnectionRunnable() {
public void afterConnect(final IConnectionPoint connectionPoint, IProgressMonitor monitor) throws CoreException, InterruptedException {
monitor.beginTask(Messages.FTPConnectionPointPropertyDialog_Task_Browse, IProgressMonitor.UNKNOWN);
monitor.subTask(""); //$NON-NLS-1$
getShell().getDisplay().syncExec(new Runnable() {
public void run() {
showBrowseDialog(connectionPoint);
}
});
monitor.done();
}
public void beforeConnect(IConnectionPoint connectionPoint) throws CoreException, InterruptedException {
((IBaseRemoteConnectionPoint) connectionPoint).setPath(Path.ROOT);
}
});
}
private void showBrowseDialog(IConnectionPoint connectionPoint) {
FileTreeSelectionDialog dlg = new FileTreeSelectionDialog(getShell(), false);
dlg.setTitle(StringUtils.format(Messages.FTPConnectionPointPropertyDialog_Title_Browse, ((IBaseRemoteConnectionPoint) connectionPoint).getHost()));
dlg.setMessage(StringUtils.makeFormLabel(Messages.FTPConnectionPointPropertyDialog_Message_Browse));
dlg.setInput(connectionPoint);
String pathString = remotePathText.getText();
try {
IFileStore selection = connectionPoint.getRoot();
if (pathString.length() > 0) {
selection = selection.getFileStore(Path.fromPortableString(pathString));
}
dlg.setInitialSelection(selection);
} catch (CoreException e) {
IdeLog.logImportant(Activator.getDefault(), StringUtils.EMPTY, e);
}
if (dlg.open() == Window.OK) {
URI uri = FileSystemUtils.getURI(dlg.getFirstResult());
if (uri != null) {
String path = Path.fromPortableString(connectionPoint.getRootURI().relativize(uri).toString()).makeAbsolute().toPortableString();
remotePathText.setText(path);
}
}
}
private void showErrorDialog(Throwable e) {
String message = Messages.FTPConnectionPointPropertyDialog_DefaultErrorMsg;
if (e instanceof CoreException) {
message = ((CoreException) e).getStatus().getMessage();
}
MessageDialog.openError(getShell(), Messages.FTPConnectionPointPropertyDialog_ErrorTitle, message);
}
protected void lockUI(boolean lock) {
lockedUI = lock;
getButton(OK).setEnabled(!lock);
nameText.setEnabled(!lock);
hostText.setEnabled(!lock);
loginCombo.setEnabled(!lock);
passwordText.setEnabled(!lock);
savePasswordButton.setEnabled(!lock);
remotePathText.setEnabled(!lock);
remotePathText.setEnabled(!lock);
testButton.setEnabled(!lock);
browseButton.setEnabled(!lock);
advancedOptions.lockUI(lock);
}
private static String valueOrEmpty(String value) {
if (value != null) {
return value;
}
return StringUtils.EMPTY;
}
}