blob: b662ecae79fbae1a1050f579e4172eaa37864a34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 The Regents of the University of California and others.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
* Contributors:
* Albert L. Rossi (NCSA) -- modified to disable proxy path for
* automatically deployed RMs
* -- modified to allow subclasses to expose extra properties/widgets (2010/11/04)
*******************************************************************************/
package org.eclipse.ptp.rm.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.ptp.remote.core.IRemoteConnection;
import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
import org.eclipse.ptp.remote.core.IRemoteFileManager;
import org.eclipse.ptp.remote.core.IRemoteProxyOptions;
import org.eclipse.ptp.remote.core.IRemoteServices;
import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager;
import org.eclipse.ptp.remote.ui.IRemoteUIFileManager;
import org.eclipse.ptp.remote.ui.IRemoteUIServices;
import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
import org.eclipse.ptp.rm.core.rmsystem.IRemoteResourceManagerConfiguration;
import org.eclipse.ptp.rm.ui.RMUIPlugin;
import org.eclipse.ptp.rm.ui.messages.Messages;
import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
import org.eclipse.ptp.utils.ui.swt.SWTUtil;
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.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
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.progress.UIJob;
/**
* Abstract base class for wizard pages used to configure proxy resource
* managers
*/
public abstract class AbstractRemoteProxyResourceManagerConfigurationWizardPage extends RMConfigurationWizardPage {
/**
* Job to validate proxyPath. We use a job here so that the input is only
* validated after the user finishes (or pauses typing). This is to prevent
* a remote lookup on every key stroke.
*
*/
protected class ValidateJob extends UIJob {
public ValidateJob() {
super("ValidateJob"); //$NON-NLS-1$
}
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
validateProxyPath();
updatePage();
return Status.OK_STATUS;
}
}
protected class WidgetListener extends SelectionAdapter implements ModifyListener, IPropertyChangeListener {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.
* events.ModifyEvent)
*/
public void modifyText(ModifyEvent evt) {
Object source = evt.getSource();
if (!loading && (source == proxyPathText)) {
/*
* Reschedule the validate job to run in VALIDATE_TIMER ms every
* time the user hits a key.
*/
validateJob.cancel();
validateJob.schedule(VALIDATE_TIMER);
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org
* .eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID))
updatePage();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
* .swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
Object source = e.getSource();
if (source == browseButton)
handlePathBrowseButtonSelected();
else if (source == optionsButton) {
proxyArgs = createOptionsDialog(getShell(), proxyArgs);
updatePage();
} else {
updateSettings();
updatePage();
}
}
}
public static final String EMPTY_STRING = ""; //$NON-NLS-1$
public static final int VALIDATE_TIMER = 250;
/**
* @since 1.1
*/
protected IRemoteResourceManagerConfiguration config;
/**
* @since 1.1
*/
protected String proxyPath = EMPTY_STRING;
/**
* @since 1.1
*/
protected String proxyArgs = EMPTY_STRING;
/**
* @since 1.1
*/
protected String localAddr = EMPTY_STRING;
/**
* @since 1.1
*/
protected IRemoteServices remoteServices = null;
/**
* @since 2.0
*/
protected IRemoteServices[] fAllRemoteServices = null;
/**
* @since 1.1
*/
protected IRemoteConnectionManager connectionManager = null;
/**
* @since 1.1
*/
protected IRemoteUIConnectionManager uiConnectionManager = null;
/**
* @since 1.1
*/
protected IRemoteConnection connection = null;
/**
* @since 1.1
*/
protected boolean loading = true;
/**
* @since 1.1
*/
protected boolean isValid;
/**
* @since 1.1
*/
protected boolean muxPortFwd = false;
/**
* @since 1.1
*/
protected boolean portFwdSupported = true;
/**
* @since 1.1
*/
protected boolean proxyPathIsValid = true;
/**
* @since 1.1
*/
protected boolean manualLaunch = false;
/**
* @since 1.1
*/
protected final Job validateJob = new ValidateJob();
/**
* @since 1.1
*/
protected final WidgetListener listener = new WidgetListener();
/**
* @since 1.1
*/
protected Text proxyPathText = null;
/**
* @since 1.1
*/
protected Button optionsButton = null;
/**
* @since 1.1
*/
protected Button browseButton = null;
/**
* @since 1.1
*/
protected Button noneButton = null;
/**
* @since 1.1
*/
protected Button portForwardingButton = null;
/**
* @since 1.1
*/
protected Button manualButton = null;
/**
* @since 1.1
*/
protected Button newConnectionButton;
/**
* @since 1.1
*/
protected Combo remoteCombo;
/**
* @since 1.1
*/
protected Combo connectionCombo;
/**
* @since 1.1
*/
protected Combo localAddrCombo;
/**
* @since 1.1
*/
protected boolean proxyPathEnabled = true;
/**
* @since 1.1
*/
protected boolean proxyOptionsEnabled = true;
/**
* @since 2.0
*/
protected boolean fManualLaunchEnabled = true;
public AbstractRemoteProxyResourceManagerConfigurationWizardPage(IRMConfigurationWizard wizard, String title) {
super(wizard, title);
setPageComplete(false);
isValid = false;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage#createControl(org
* .eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout topLayout = new GridLayout();
composite.setLayout(topLayout);
createContents(composite);
setControl(composite);
}
/**
* Initialize the contents of the local address selection combo. Host names
* are obtained by performing a reverse lookup on the IP addresses of each
* network interface. If DNS is configured correctly, this should add the
* fully qualified domain name, otherwise it will probably be the IP
* address. We also add the configuration address to the combo in case it
* was specified manually.
*/
public void initializeLocalHostCombo() {
Set<String> addrs = new TreeSet<String>();
try {
Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
NetworkInterface ni = netInterfaces.nextElement();
Enumeration<InetAddress> alladdr = ni.getInetAddresses();
while (alladdr.hasMoreElements()) {
InetAddress ip = alladdr.nextElement();
if (ip instanceof Inet4Address)
addrs.add(fixHostName(ip.getCanonicalHostName()));
}
}
} catch (Exception e) {
// at least we'll still get localhost
}
if (addrs.size() == 0)
addrs.add("localhost"); //$NON-NLS-1$
localAddrCombo.removeAll();
int index = 0;
int selection = -1;
for (String addr : addrs) {
localAddrCombo.add(addr);
if ((localAddr.equals("") && addr.equals("localhost")) //$NON-NLS-1$ //$NON-NLS-2$
|| addr.equals(localAddr))
selection = index;
index++;
}
/*
* localAddr is not in the list, so add it and make it the current
* selection
*/
if (selection < 0) {
if (!localAddr.equals("")) //$NON-NLS-1$
localAddrCombo.add(localAddr);
selection = localAddrCombo.getItemCount() - 1;
}
localAddrCombo.select(selection);
}
/**
* Save the current state in the RM configuration. This is called whenever
* anything is changed.
*
* @return
*/
public boolean performOk() {
store();
int options = 0;
if (muxPortFwd)
options |= IRemoteProxyOptions.PORT_FORWARDING;
if (manualLaunch)
options |= IRemoteProxyOptions.MANUAL_LAUNCH;
if (remoteServices != null)
config.setRemoteServicesId(remoteServices.getId());
if (connection != null)
config.setConnectionName(connection.getName());
config.setLocalAddress(localAddr);
config.setProxyServerPath(proxyPath);
config.setInvocationOptions(proxyArgs);
config.setOptions(options);
return true;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
*/
@Override
public void setVisible(boolean visible) {
if (visible)
initContents();
super.setVisible(visible);
}
/**
* specialized implementation override this.
*
* @since 2.0
*/
protected void addCustomWidgets(Composite remoteComp) {
// NO-OP
}
/**
* Convenience method for creating a button widget.
*
* @param parent
* @param label
* @param type
* @return the button widget
*/
protected Button createButton(Composite parent, String label, int type) {
Button button = new Button(parent, type);
button.setText(label);
GridData data = new GridData();
button.setLayoutData(data);
return button;
}
/**
* Convenience method for creating a check button widget.
*
* @param parent
* @param label
* @return the check button widget
*/
protected Button createCheckButton(Composite parent, String label) {
return createButton(parent, label, SWT.CHECK | SWT.LEFT);
}
/**
* Convenience method for creating a grid layout.
*
* @param columns
* @param isEqual
* @param mh
* @param mw
* @return the new grid layout
*/
protected GridLayout createGridLayout(int columns, boolean isEqual, int mh, int mw) {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = columns;
gridLayout.makeColumnsEqualWidth = isEqual;
gridLayout.marginHeight = mh;
gridLayout.marginWidth = mw;
return gridLayout;
}
/**
* Creates the dialog when the proxy "Options..." button is selected.
* Override if you want to provide your own dialog.
*
* @param parent
* the parent composite to contain the dialog area
* @return the proxy options string
*/
protected String createOptionsDialog(Shell shell, String initialOptions) {
InputDialog dialog = new InputDialog(shell, Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_14,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_15, initialOptions, null);
if (dialog.open() == Dialog.OK)
return dialog.getValue();
return initialOptions;
}
/**
* Creates an new radio button instance and sets the default layout data.
*
* @param group
* the composite in which to create the radio button
* @param label
* the string to set into the radio button
* @param value
* the string to identify radio button
* @return the new radio button
*/
protected Button createRadioButton(Composite parent, String label, String value, SelectionListener listener) {
Button button = createButton(parent, label, SWT.RADIO | SWT.LEFT);
button.setData((null == value) ? label : value);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.BEGINNING;
button.setLayoutData(data);
if (null != listener)
button.addSelectionListener(listener);
return button;
}
/**
* Transfer current settings to text fields
*/
protected void defaultSetting() {
if (proxyPathEnabled)
proxyPathText.setText(proxyPath);
}
/**
* Clean up the content of a text field.
*
* @param text
* @return cleaned up text.
*/
protected String getFieldContent(String text) {
if (text.trim().length() == 0 || text.equals(EMPTY_STRING))
return null;
return text;
}
/**
* Handle the section of a new connection. Update connection option buttons
* appropriately.
*/
protected void handleConnectionSelected() {
int currentSelection = connectionCombo.getSelectionIndex();
if (currentSelection >= 0 && connectionManager != null) {
String connectionName = connectionCombo.getItem(currentSelection);
connection = connectionManager.getConnection(connectionName);
}
/*
* Disable port forwarding button if it's not supported. If port
* forwarding was selected, switch to 'none' instead.
*/
if (connection != null)
portFwdSupported = connection.supportsTCPPortForwarding();
/*
* Linux doesn't call modify handler (which calls updateSettings &
* updatePage) so need to call them explicitly here
*/
updateSettings();
updatePage();
}
/**
* Handle creation of a new connection by pressing the 'New...' button.
* Calls handleRemoteServicesSelected() to update the connection combo with
* the new connection.
*
* TODO should probably select the new connection
*/
protected void handleNewRemoteConnectionSelected() {
if (uiConnectionManager != null)
handleRemoteServiceSelected(uiConnectionManager.newConnection(getShell()));
}
/**
* Show a dialog that lets the user select a file.
*/
protected void handlePathBrowseButtonSelected() {
if (!proxyPathEnabled)
return;
if (connection != null) {
checkConnection();
if (connection.isOpen()) {
IRemoteUIServices remoteUIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(remoteServices);
if (remoteUIServices != null) {
IRemoteUIFileManager fileMgr = remoteUIServices.getUIFileManager();
if (fileMgr != null) {
fileMgr.setConnection(connection);
String correctPath = proxyPathText.getText();
String selectedPath = fileMgr.browseFile(getShell(),
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_16, correctPath, 0);
if (selectedPath != null)
proxyPathText.setText(selectedPath.toString());
}
}
}
}
}
/**
* Handle selection of a new remote services provider from the remote
* services combo.
*
* The assumption is that this will trigger a call to the selection handler
* for the connection combo.
*
* @param conn
* connection to select as current. If conn is null, select the
* first item in the list.
*/
protected void handleRemoteServiceSelected(IRemoteConnection conn) {
int selectionIndex = remoteCombo.getSelectionIndex();
if (fAllRemoteServices != null && fAllRemoteServices.length > 0 && selectionIndex >= 0) {
remoteServices = fAllRemoteServices[selectionIndex];
connectionManager = remoteServices.getConnectionManager();
IRemoteUIServices remUIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(remoteServices);
if (remUIServices != null)
uiConnectionManager = remUIServices.getUIConnectionManager();
IRemoteConnection[] connections = connectionManager.getConnections();
Arrays.sort(connections, new Comparator<IRemoteConnection>() {
public int compare(IRemoteConnection c1, IRemoteConnection c2) {
return c1.getName().compareToIgnoreCase(c2.getName());
}
});
connectionCombo.removeAll();
int selected = 0;
for (int i = 0; i < connections.length; i++) {
connectionCombo.add(connections[i].getName());
if (conn != null && connections[i].equals(conn))
selected = i;
}
if (connections.length > 0) {
connectionCombo.select(selected);
/*
* Linux doesn't call selection handler so need to call it
* explicitly here
*/
handleConnectionSelected();
}
/*
* Enable 'new' button if new connections are supported
*/
newConnectionButton.setEnabled(uiConnectionManager != null);
}
}
/**
* Initialize the contents of the controls on the page. This is called after
* the controls have been created.
*
* @since 2.0
*/
protected void initContents() {
loading = true;
config = (IRemoteResourceManagerConfiguration) getConfigurationWizard().getConfiguration();
loadSaved();
updateSettings();
defaultSetting();
initializeRemoteServicesCombo();
initializeLocalHostCombo();
loading = false;
updatePage();
}
/**
* Initialize the contents of the remote services combo.
*
* The assumption is that this will trigger a call to the selection handling
* routine when the default index is selected.
*/
protected void initializeRemoteServicesCombo() {
IWizardContainer container = null;
if (getControl().isVisible())
container = getWizard().getContainer();
fAllRemoteServices = PTPRemoteUIPlugin.getDefault().getRemoteServices(container);
IRemoteServices defServices;
if (remoteServices != null)
defServices = remoteServices;
else
defServices = PTPRemoteCorePlugin.getDefault().getDefaultServices();
int defIndex = 0;
Arrays.sort(fAllRemoteServices, new Comparator<IRemoteServices>() {
public int compare(IRemoteServices c1, IRemoteServices c2) {
return c1.getName().compareToIgnoreCase(c2.getName());
}
});
remoteCombo.removeAll();
for (int i = 0; i < fAllRemoteServices.length; i++) {
remoteCombo.add(fAllRemoteServices[i].getName());
if (fAllRemoteServices[i].equals(defServices))
defIndex = i;
}
if (fAllRemoteServices.length > 0) {
remoteCombo.select(defIndex);
/*
* Linux doesn't call selection handler so need to call it
* explicitly here
*/
handleRemoteServiceSelected(connection);
handleConnectionSelected();
}
}
/**
* @return
*/
protected boolean isValidSetting() {
if (proxyPathEnabled && proxyPathText != null) {
String name = getFieldContent(proxyPathText.getText());
if (name == null || !proxyPathIsValid) {
setErrorMessage(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_17);
return false;
}
}
return true;
}
/**
* @param style
* @param space
* @return
*/
protected GridData spanGridData(int style, int space) {
GridData gd = null;
if (style == -1)
gd = new GridData();
else
gd = new GridData(style);
gd.horizontalSpan = space;
return gd;
}
/**
* Call to update page status and store any changed settings
*/
protected void updatePage() {
if (!loading) {
setErrorMessage(null);
setMessage(null);
if (!isValidSetting())
setValid(false);
else {
performOk();
setValid(true);
}
}
}
/**
* Update wizard UI selections from settings. This should be called whenever
* any settings are changed.
*
* @since 1.1
*/
protected void updateSettings() {
/*
* Get current settings unless we're initializing things
*/
if (!loading) {
muxPortFwd = portForwardingButton.getSelection();
if (manualButton != null)
manualLaunch = manualButton.getSelection();
}
/*
* If no localAddr has been specified in the configuration, select a
* default one.
*/
if (!loading || localAddr.equals("")) //$NON-NLS-1$
localAddr = localAddrCombo.getText();
/*
* Fix settings
*/
if (muxPortFwd && !portFwdSupported)
muxPortFwd = false;
/*
* Update UI to display correct settings
*/
if (noneButton != null)
noneButton.setSelection(!muxPortFwd);
if (portForwardingButton != null) {
portForwardingButton.setSelection(muxPortFwd);
portForwardingButton.setEnabled(portFwdSupported);
}
if (localAddrCombo != null)
localAddrCombo.setEnabled(!muxPortFwd);
if (manualButton != null)
manualButton.setSelection(manualLaunch);
}
/**
* Check if the proxy path supplied in proxyPathText is a valid file on the
* remote system.
*
* @return true if valid
* @since 1.1
*/
protected boolean validateProxyPath() {
if (!proxyPathEnabled)
return true;
proxyPathIsValid = false;
final String path = proxyPathText.getText();
if (path != null)
if (connection != null) {
checkConnection();
if (connection.isOpen())
if (remoteServices != null) {
final IRemoteFileManager fileMgr = remoteServices.getFileManager(connection);
if (fileMgr != null) {
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
IFileStore file = fileMgr.getResource(path);
if (!monitor.isCanceled())
proxyPathIsValid = file.fetchInfo(EFS.NONE, monitor).exists();
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
};
try {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
dialog.setOpenOnRun(false);
dialog.run(true, true, op);
} catch (InvocationTargetException e) {
// return false
} catch (InterruptedException e) {
// return false
}
}
}
}
return proxyPathIsValid;
}
/**
* Attempt to open a connection.
*/
private void checkConnection() {
if (!connection.isOpen()) {
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
connection.open(monitor);
if (monitor.isCanceled())
throw new InterruptedException(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_0);
} catch (RemoteConnectionException e) {
throw new InvocationTargetException(e);
}
}
};
try {
new ProgressMonitorDialog(getShell()).run(true, true, op);
} catch (InvocationTargetException e) {
ErrorDialog.openError(getShell(), Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_1,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_2, new Status(IStatus.ERROR,
RMUIPlugin.PLUGIN_ID, e.getCause().getMessage()));
} catch (InterruptedException e) {
ErrorDialog.openError(getShell(), Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_3,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_2, new Status(IStatus.ERROR,
RMUIPlugin.PLUGIN_ID, e.getMessage()));
}
}
}
/**
* Create the contents of the wizard page.
*
* @param parent
* @param colSpan
*/
private void createContents(Composite parent) {
/*
* Composite for remote information
*/
Composite remoteComp = new Composite(parent, SWT.NONE);
GridLayout remoteLayout = new GridLayout();
remoteLayout.numColumns = 4;
remoteLayout.marginWidth = 0;
remoteComp.setLayout(remoteLayout);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 4;
remoteComp.setLayoutData(gd);
/*
* Remote provider
*/
Label label = new Label(remoteComp, SWT.NONE);
label.setText(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_4);
gd = new GridData();
gd.horizontalSpan = 1;
label.setLayoutData(gd);
remoteCombo = new Combo(remoteComp, SWT.DROP_DOWN | SWT.READ_ONLY);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
remoteCombo.setLayoutData(gd);
/*
* Proxy location
*/
label = new Label(remoteComp, SWT.NONE);
label.setText(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_5);
gd = new GridData();
gd.horizontalSpan = 1;
label.setLayoutData(gd);
connectionCombo = new Combo(remoteComp, SWT.DROP_DOWN | SWT.READ_ONLY);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
connectionCombo.setLayoutData(gd);
newConnectionButton = SWTUtil.createPushButton(remoteComp,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_6, null);
if (proxyPathEnabled) {
/*
* Proxy path
*/
label = new Label(remoteComp, SWT.NONE);
label.setText(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_7);
gd = new GridData();
gd.horizontalSpan = 1;
label.setLayoutData(gd);
proxyPathText = new Text(remoteComp, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
gd.grabExcessHorizontalSpace = true;
gd.widthHint = 100;
proxyPathText.setLayoutData(gd);
proxyPathText.addModifyListener(listener);
browseButton = SWTUtil.createPushButton(remoteComp,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_8, null);
browseButton.addSelectionListener(listener);
}
if (proxyOptionsEnabled) {
/*
* Proxy options
*/
optionsButton = SWTUtil.createPushButton(remoteComp,
Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_9, null);
optionsButton.addSelectionListener(listener);
}
/*
* customizable
*/
addCustomWidgets(remoteComp);
/*
* Multiplexing options
*/
Group mxGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
mxGroup.setLayout(createGridLayout(1, true, 10, 10));
mxGroup.setLayoutData(spanGridData(GridData.FILL_HORIZONTAL, 2));
mxGroup.setText(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_10);
noneButton = createRadioButton(mxGroup, Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_11,
"mxGroup", listener); //$NON-NLS-1$
noneButton.addSelectionListener(listener);
/*
* Local address
*/
Composite addrComp = new Composite(mxGroup, SWT.NONE);
GridLayout addrLayout = new GridLayout();
addrLayout.numColumns = 2;
addrLayout.marginWidth = 0;
addrLayout.marginLeft = 15;
addrComp.setLayout(addrLayout);
gd = new GridData(GridData.FILL_HORIZONTAL);
addrComp.setLayoutData(gd);
label = new Label(addrComp, SWT.NONE);
label.setText(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_12);
gd = new GridData();
gd.horizontalSpan = 1;
label.setLayoutData(gd);
localAddrCombo = new Combo(addrComp, SWT.DROP_DOWN);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
localAddrCombo.setLayoutData(gd);
portForwardingButton = createRadioButton(mxGroup, Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_13,
"mxGroup", listener); //$NON-NLS-1$
portForwardingButton.addSelectionListener(listener);
/*
* Manual launch
*/
if (fManualLaunchEnabled) {
manualButton = createCheckButton(parent, "Launch server manually"); //$NON-NLS-1$
manualButton.addSelectionListener(listener);
}
registerListeners();
}
/**
* In some nameserver configurations, getCanonicalHostName() will return the
* inverse mapping of the IP address (e.g. 1.1.0.192.in-addr.arpa). In this
* case we just use the IP address.
*
* @param hostname
* host name to be fixed
* @return fixed host name
*/
private String fixHostName(String hostname) {
try {
if (hostname.endsWith(".in-addr.arpa")) //$NON-NLS-1$
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
// should not happen
}
return hostname;
}
/**
* Load the initial wizard state from the configuration settings.
*/
private void loadSaved() {
proxyPath = config.getProxyServerPath();
proxyArgs = config.getInvocationOptionsStr();
localAddr = config.getLocalAddress();
String rmID = config.getRemoteServicesId();
if (rmID != null) {
IWizardContainer container = null;
if (getControl().isVisible())
container = getWizard().getContainer();
remoteServices = PTPRemoteUIPlugin.getDefault().getRemoteServices(rmID, container);
String conn = config.getConnectionName();
if (remoteServices != null && conn != null)
connection = remoteServices.getConnectionManager().getConnection(conn);
}
int options = config.getOptions();
muxPortFwd = (options & IRemoteProxyOptions.PORT_FORWARDING) == IRemoteProxyOptions.PORT_FORWARDING;
manualLaunch = (options & IRemoteProxyOptions.MANUAL_LAUNCH) == IRemoteProxyOptions.MANUAL_LAUNCH;
}
/**
* @since 1.1
*/
private void registerListeners() {
remoteCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
/*
* If we're loading saved settings, then we want to select the
* saved connection after the remote services are selected.
* Otherwise just pick the default item.
*/
if (loading)
handleRemoteServiceSelected(connection);
else
handleRemoteServiceSelected(null);
updateSettings();
}
});
connectionCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
handleConnectionSelected();
updatePage();
}
});
newConnectionButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
handleNewRemoteConnectionSelected();
updatePage();
}
});
localAddrCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateSettings();
updatePage();
}
});
}
/**
* Set the isValid flag and page completion status
*
* @param complete
* true if complete
*/
private void setValid(boolean complete) {
isValid = complete;
setPageComplete(isValid);
}
/**
* Store text fields
*/
private void store() {
if (proxyPathEnabled && proxyPathText != null)
proxyPath = proxyPathText.getText();
}
}