/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ui.secureftp.internal;
import java.nio.charset.Charset;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.aptana.core.util.ArrayUtil;
import com.aptana.core.util.StringUtil;
import com.aptana.filesystem.secureftp.ISFTPConnectionPoint;
import com.aptana.filesystem.secureftp.ISFTPConstants;
import com.aptana.ide.ui.io.dialogs.IDialogConstants;
import com.aptana.ui.ftp.internal.IOptionsComposite;
import com.aptana.ui.ftp.internal.NumberVerifyListener;
/**
* @author Max Stepanov
*
*/
public class SFTPAdvancedOptionsComposite extends Composite implements IOptionsComposite {
private IListener listener;
private Combo compressionCombo;
private Text portText;
private Combo encodingCombo;
private ModifyListener modifyListener;
/**
* @param parent
* @param style
*/
public SFTPAdvancedOptionsComposite(Composite parent, int style, IListener listener) {
super(parent, style);
this.listener = listener;
setLayout(GridLayoutFactory.swtDefaults().numColumns(5)
.spacing(new PixelConverter(this).convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING),
new PixelConverter(this).convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING))
.create());
/* row 1 */
Label label = new Label(this, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(this).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtil.makeFormLabel(Messages.SFTPAdvancedOptionsComposite_Compression));
compressionCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
compressionCombo.add(ISFTPConstants.COMPRESSION_AUTO);
compressionCombo.add(ISFTPConstants.COMPRESSION_NONE);
compressionCombo.add(ISFTPConstants.COMPRESSION_ZLIB);
compressionCombo.setLayoutData(GridDataFactory.swtDefaults().hint(
compressionCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x, SWT.DEFAULT).create());
label = new Label(this, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).hint(
new PixelConverter(this).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label = new Label(this, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().create());
label.setText(StringUtil.makeFormLabel(Messages.SFTPAdvancedOptionsComposite_Port));
portText = new Text(this, SWT.SINGLE | SWT.RIGHT | SWT.BORDER);
portText.setLayoutData(GridDataFactory.swtDefaults().hint(
Math.max(
new PixelConverter(portText).convertWidthInCharsToPixels(5),
portText.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x
), SWT.DEFAULT).create());
/* row 2 */
label = new Label(this, SWT.NONE);
label.setLayoutData(GridDataFactory.swtDefaults().hint(
new PixelConverter(this).convertHorizontalDLUsToPixels(IDialogConstants.LABEL_WIDTH),
SWT.DEFAULT).create());
label.setText(StringUtil.makeFormLabel(Messages.SFTPAdvancedOptionsComposite_Encoding));
encodingCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
encodingCombo.setItems(Charset.availableCharsets().keySet().toArray(ArrayUtil.NO_STRINGS));
encodingCombo.setLayoutData(GridDataFactory.swtDefaults().hint(
encodingCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x, SWT.DEFAULT)
.span(4, 1).create());
/* -- */
addListeners();
portText.addVerifyListener(new NumberVerifyListener());
}
/* (non-Javadoc)
* @see com.aptana.ide.ui.io.IPropertiesEditor#loadPropertiesFrom(java.lang.Object)
*/
public void loadPropertiesFrom(Object element) {
Assert.isLegal(element instanceof ISFTPConnectionPoint);
ISFTPConnectionPoint sftpConnectionPoint = (ISFTPConnectionPoint) element;
removeListeners();
try {
int index = compressionCombo.indexOf(String.valueOf(sftpConnectionPoint.getCompression()));
if (index >= 0) {
compressionCombo.select(index);
}
portText.setText(Integer.toString(sftpConnectionPoint.getPort()));
index = encodingCombo.indexOf(String.valueOf(sftpConnectionPoint.getEncoding()));
if (index >= 0) {
encodingCombo.select(index);
}
} finally {
addListeners();
}
}
/* (non-Javadoc)
* @see com.aptana.ide.ui.io.IPropertiesEditor#savePropertiesTo(java.lang.Object)
*/
public boolean savePropertiesTo(Object element) {
Assert.isLegal(element instanceof ISFTPConnectionPoint);
boolean updated = false;
ISFTPConnectionPoint sftpConnectionPoint = (ISFTPConnectionPoint) element;
String compression = compressionCombo.getItem(compressionCombo.getSelectionIndex());
if (!sftpConnectionPoint.getCompression().equals(compression)) {
sftpConnectionPoint.setCompression(compression);
updated = true;
}
int port = Integer.parseInt(portText.getText());
if (sftpConnectionPoint.getPort() != port) {
sftpConnectionPoint.setPort(port);
updated = true;
}
String encoding = encodingCombo.getItem(encodingCombo.getSelectionIndex());
if (!sftpConnectionPoint.getEncoding().equals(encoding)) {
sftpConnectionPoint.setEncoding(encoding);
updated = true;
}
return updated;
}
/* (non-Javadoc)
* @see com.aptana.ui.ftp.internal.IOptionsComposite#isValid()
*/
public String isValid() {
int port = 0;
try {
port = Integer.parseInt(portText.getText());
} catch (NumberFormatException e) {
e.getCause();
}
if (port <= 0) {
return Messages.SFTPAdvancedOptionsComposite_InvalidPort;
}
return null;
}
/* (non-Javadoc)
* @see com.aptana.ui.ftp.internal.IOptionsComposite#setValid(boolean)
*/
public void setValid(boolean valid) {
}
/* (non-Javadoc)
* @see com.aptana.ui.ftp.internal.IOptionsComposite#lockUI(boolean)
*/
public void lockUI(boolean lock) {
compressionCombo.setEnabled(!lock);
portText.setEnabled(!lock);
encodingCombo.setEnabled(!lock);
}
protected void addListeners() {
if (modifyListener == null) {
modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
listener.validate();
}
};
}
portText.addModifyListener(modifyListener);
}
protected void removeListeners() {
if (modifyListener != null) {
portText.removeModifyListener(modifyListener);
}
}
}