/*******************************************************************************
* Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.ui.editor.sections;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.TypedEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tcf.protocol.IChannel;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.core.interfaces.IConnectable;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
import org.eclipse.tcf.te.tcf.core.Tcf;
import org.eclipse.tcf.te.tcf.core.interfaces.IPeerProperties;
import org.eclipse.tcf.te.tcf.core.interfaces.ITransportTypes;
import org.eclipse.tcf.te.tcf.core.peers.Peer;
import org.eclipse.tcf.te.tcf.core.util.persistence.PeerDataHelper;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties;
import org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelLookupService;
import org.eclipse.tcf.te.tcf.locator.model.ModelManager;
import org.eclipse.tcf.te.tcf.ui.nls.Messages;
import org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl;
import org.eclipse.tcf.te.ui.controls.net.RemoteHostAddressControl;
import org.eclipse.tcf.te.ui.controls.net.RemoteHostPortControl;
import org.eclipse.tcf.te.ui.controls.validator.NameOrIPValidator;
import org.eclipse.tcf.te.ui.controls.validator.Validator;
import org.eclipse.tcf.te.ui.controls.wire.network.NetworkAddressControl;
import org.eclipse.tcf.te.ui.controls.wire.network.NetworkCablePanel;
import org.eclipse.tcf.te.ui.forms.parts.AbstractSection;
import org.eclipse.tcf.te.ui.interfaces.data.IDataExchangeNode;
import org.eclipse.tcf.te.ui.jface.interfaces.IValidatingContainer;
import org.eclipse.tcf.te.ui.swt.SWTControlUtil;
import org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* Transport section providing TCP transport only.
*/
public class TcpTransportSection extends AbstractSection implements IDataExchangeNode {
private BaseEditBrowseTextControl proxyControl = null;
private MyRemoteHostAddressControl addressControl = null;
private MyRemoteHostPortControl portControl = null;
private boolean isAutoPort = false;
private String proxies = null;
// Reference to the original data object
protected IPeerNode od;
// Reference to a copy of the original data
/* default */final IPropertiesContainer odc = new PropertiesContainer();
// Reference to the properties container representing the working copy for the section
/* default */final IPropertiesContainer wc = new PropertiesContainer();
/**
* Local address control implementation.
*/
protected class MyNetworkAddressControl extends NetworkAddressControl {
/**
* Constructor.
*
* @param networkPanel The parent network cable. Must not be <code>null</code>.
*/
public MyNetworkAddressControl(NetworkCablePanel networkPanel) {
super(networkPanel);
setEditFieldLabel(Messages.MyNetworkAddressControl_label);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.net.RemoteHostAddressControl#configureEditFieldValidator(org.eclipse.tcf.te.ui.controls.validator.Validator)
*/
@Override
protected void configureEditFieldValidator(Validator validator) {
if (validator instanceof NameOrIPValidator) {
validator.setMessageText(NameOrIPValidator.INFO_MISSING_NAME_OR_IP, Messages.MyNetworkAddressControl_information_missingTargetNameAddress);
validator.setMessageText(NameOrIPValidator.ERROR_INVALID_NAME_OR_IP, Messages.MyNetworkAddressControl_error_invalidTargetNameAddress);
validator.setMessageText(NameOrIPValidator.ERROR_INVALID_NAME, Messages.MyNetworkAddressControl_error_invalidTargetNameAddress);
validator.setMessageText(NameOrIPValidator.ERROR_INVALID_IP, Messages.MyNetworkAddressControl_error_invalidTargetIpAddress);
validator.setMessageText(NameOrIPValidator.INFO_CHECK_NAME, getUserInformationTextCheckNameAddress());
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.net.RemoteHostAddressControl#getUserInformationTextCheckNameAddress()
*/
@Override
protected String getUserInformationTextCheckNameAddress() {
return Messages.MyNetworkAddressControl_information_checkNameAddressUserInformation;
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseDialogPageControl#getValidatingContainer()
*/
@Override
public IValidatingContainer getValidatingContainer() {
Object container = TcpTransportSection.this.getManagedForm().getContainer();
return container instanceof IValidatingContainer ? (IValidatingContainer)container : null;
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
super.modifyText(e);
TcpTransportSection.this.dataChanged(e);
}
}
/**
* Local remote host address control implementation.
*/
protected class MyRemoteHostAddressControl extends RemoteHostAddressControl {
/**
* Constructor.
*/
public MyRemoteHostAddressControl() {
super(null);
setEditFieldLabel(Messages.MyRemoteHostAddressControl_label);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseDialogPageControl#getValidatingContainer()
*/
@Override
public IValidatingContainer getValidatingContainer() {
Object container = TcpTransportSection.this.getManagedForm().getContainer();
return container instanceof IValidatingContainer ? (IValidatingContainer)container : null;
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
super.modifyText(e);
TcpTransportSection.this.dataChanged(e);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.net.RemoteHostAddressControl#onButtonControlSelected()
*/
@Override
protected void onButtonControlSelected() {
super.onButtonControlSelected();
getValidatingContainer().setMessage(getMessage(), getMessageType());
}
}
/**
* Local remote host port control implementation.
*/
public class MyRemoteHostPortControl extends RemoteHostPortControl {
/**
* Constructor.
*/
public MyRemoteHostPortControl() {
super(null);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseDialogPageControl#getValidatingContainer()
*/
@Override
public IValidatingContainer getValidatingContainer() {
Object container = TcpTransportSection.this.getManagedForm().getContainer();
return container instanceof IValidatingContainer ? (IValidatingContainer)container : null;
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
super.modifyText(e);
TcpTransportSection.this.dataChanged(e);
}
}
/**
* Constructor.
*
* @param form The parent managed form. Must not be <code>null</code>.
* @param parent The parent composite. Must not be <code>null</code>.
*/
public TcpTransportSection(IManagedForm form, Composite parent) {
super(form, parent, ExpandableComposite.EXPANDED);
createClient(getSection(), form.getToolkit());
}
/**
* Constructor.
*
* @param form The parent managed form. Must not be <code>null</code>.
* @param parent The parent composite. Must not be <code>null</code>.
*/
public TcpTransportSection(IManagedForm form, Composite parent, boolean showTitleBar) {
super(form, parent, showTitleBar ? ExpandableComposite.EXPANDED : ExpandableComposite.NO_TITLE, showTitleBar);
createClient(getSection(), form.getToolkit());
}
/* (non-Javadoc)
* @see org.eclipse.ui.forms.AbstractFormPart#dispose()
*/
@Override
public void dispose() {
if (proxyControl != null) { proxyControl.dispose(); proxyControl = null; }
if (addressControl != null) { addressControl.dispose(); addressControl = null; }
if (portControl != null) { portControl.dispose(); portControl = null; }
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter(Class adapter) {
if (MyRemoteHostAddressControl.class.equals(adapter)) {
return addressControl;
}
if (MyRemoteHostPortControl.class.equals(adapter)) {
return portControl;
}
return super.getAdapter(adapter);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#createClient(org.eclipse.ui.forms.widgets.Section, org.eclipse.ui.forms.widgets.FormToolkit)
*/
@Override
protected void createClient(Section section, FormToolkit toolkit) {
Assert.isNotNull(section);
Assert.isNotNull(toolkit);
// Configure the section
section.setText(Messages.TcpTransportSection_title);
if (section.getParent().getLayout() instanceof GridLayout) {
section.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
// Create the section client
Composite client = createClientContainer(section, 2, toolkit);
Assert.isNotNull(client);
section.setClient(client);
proxyControl = new BaseEditBrowseTextControl(null);
proxyControl.setFormToolkit(toolkit);
proxyControl.setParentControlIsInnerPanel(true);
proxyControl.setEditFieldLabel(Messages.TcpTransportSection_proxies_label);
proxyControl.setReadOnly(true);
proxyControl.setHasHistory(false);
proxyControl.setHideBrowseButton(true);
proxyControl.setupPanel(client);
SWTControlUtil.setEnabled(proxyControl.getEditFieldControl(), false);
addressControl = new MyRemoteHostAddressControl();
addressControl.setFormToolkit(toolkit);
addressControl.setupPanel(client);
addressControl.getEditFieldControl().setFocus();
portControl = new MyRemoteHostPortControl();
portControl.setFormToolkit(toolkit);
portControl.setParentControlIsInnerPanel(true);
portControl.setupPanel(addressControl.getInnerPanelComposite());
portControl.setEditFieldControlText(getDefaultPort());
}
/**
* Returns the default port to set to the port control.
*
* @return The default port to set or <code>null</code>.
*/
protected String getDefaultPort() {
return "1534"; //$NON-NLS-1$
}
/**
* Set the auto port state.
*
* @param value <code>True</code> if the port is an "auto port", <code>false</code> otherwise.
*/
protected final void setIsAutoPort(boolean value) {
isAutoPort = value;
if (portControl != null) portControl.setEnabled(!isAutoPort);
}
/**
* Returns the auto port state.
*
* @return <code>True</code> if the port is an "auto port", <code>false</code> otherwise.
*/
protected final boolean isAutoPort() {
return isAutoPort;
}
/**
* Indicates whether the sections parent page has become the active in the editor.
*
* @param active <code>True</code> if the parent page should be visible, <code>false</code>
* otherwise.
*/
public void setActive(boolean active) {
// If the parent page has become the active and it does not contain
// unsaved data, than fill in the data from the selected node
if (active) {
// Leave everything unchanged if the page is in dirty state
if (getManagedForm().getContainer() instanceof AbstractEditorPage && !((AbstractEditorPage) getManagedForm().getContainer()).isDirty()) {
Object node = ((AbstractEditorPage) getManagedForm().getContainer()).getEditorInputNode();
if (node instanceof IPeerNode) {
setupData((IPeerNode) node);
}
}
}
else {
// Evaluate the dirty state even if going inactive
dataChanged(null);
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.interfaces.data.IDataExchangeNode#setupData(org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer)
*/
@Override
public void setupData(IPropertiesContainer data) {
Assert.isNotNull(data);
// Mark the control update as in-progress now
setIsUpdating(true);
boolean isAutoPort = data.getBooleanProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO);
if (proxyControl != null) {
proxies = data.getStringProperty(IPeerProperties.PROP_PROXIES);
IPeer[] proxyPeers = PeerDataHelper.decodePeerList(proxies);
String proxyInfo = ""; //$NON-NLS-1$
for (final IPeer proxy : proxyPeers) {
final AtomicReference<ILocatorNode> locatorNode = new AtomicReference<ILocatorNode>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
ILocatorModelLookupService lkup = ModelManager.getLocatorModel().getService(ILocatorModelLookupService.class);
locatorNode.set(lkup.lkupLocatorNode(proxy));
}
});
if (proxyInfo.length() > 0) {
proxyInfo += " / "; //$NON-NLS-1$
}
String name = locatorNode.get() != null ? locatorNode.get().getPeer().getName() : proxy.getID();
if (name == null || name.trim().length() == 0) {
name = locatorNode.get() != null ? locatorNode.get().getPeer().getID() : proxy.getID();
}
else if (locatorNode.get() != null) {
name += " (" + locatorNode.get().getPeer().getAttributes().get(IPeer.ATTR_IP_HOST) + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
proxyInfo += name.trim();
}
proxyControl.setEditFieldControlText(proxyInfo);
}
if (addressControl != null) {
String ip = data.getStringProperty(IPeer.ATTR_IP_HOST);
if (ip != null)
addressControl.setEditFieldControlText(ip);
}
if (portControl != null) {
String port = data.getStringProperty(IPeer.ATTR_IP_PORT);
if (port != null)
portControl.setEditFieldControlText(port);
}
setIsAutoPort(isAutoPort);
// Mark the control update as completed now
setIsUpdating(false);
// Re-evaluate the dirty state
dataChanged(null);
// Adjust the control enablement
updateEnablement();
}
/**
* Initialize the page widgets based of the data from the given peer node.
* <p>
* This method may called multiple times during the lifetime of the page and the given
* configuration node might be even <code>null</code>.
*
* @param node The peer node or <code>null</code>.
*/
public void setupData(final IPeerNode node) {
// If the section is dirty, nothing is changed
if (isDirty()) return;
boolean updateWidgets = true;
// If the passed in node is the same as the previous one,
// no need for updating the section widgets.
if ((node == null && od == null) || (node != null && node.equals(od))) {
updateWidgets = false;
}
// Besides the node itself, we need to look at the node data to determine
// if the widgets needs to be updated. For the comparisation, keep the
// current properties of the original data copy in a temporary container.
final IPropertiesContainer previousOdc = new PropertiesContainer();
previousOdc.setProperties(odc.getProperties());
// Store a reference to the original data
od = node;
// Clean the original data copy
odc.clearProperties();
// Clean the working copy
wc.clearProperties();
// If no data is available, we are done
if (node == null) return;
// Thread access to the model is limited to the executors thread.
// Copy the data over to the working copy to ease the access.
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
// The section is handling the transport name and the
// transport type specific properties. Ignore other properties.
odc.setProperty(IPeer.ATTR_TRANSPORT_NAME, node.getPeer().getTransportName());
odc.setProperty(IPeer.ATTR_IP_HOST, node.getPeer().getAttributes().get(IPeer.ATTR_IP_HOST));
odc.setProperty(IPeer.ATTR_IP_PORT, node.getPeer().getAttributes().get(IPeer.ATTR_IP_PORT));
odc.setProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO, node.getPeer().getAttributes().get(IPeerProperties.PROP_IP_PORT_IS_AUTO));
odc.setProperty(IPeerProperties.PROP_PROXIES, node.getPeer().getAttributes().get(IPeerProperties.PROP_PROXIES));
// Initially, the working copy is a duplicate of the original data copy
wc.setProperties(odc.getProperties());
}
});
// From here on, work with the working copy only!
// If the original data copy does not match the previous original
// data copy, the widgets needs to be updated to present the correct data.
if (!previousOdc.getProperties().equals(odc.getProperties())) {
updateWidgets = true;
}
if (updateWidgets) {
setupData(wc);
}
else {
// Re-evaluate the dirty state
dataChanged(null);
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.interfaces.data.IDataExchangeNode#extractData(org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer)
*/
@Override
public void extractData(IPropertiesContainer data) {
Assert.isNotNull(data);
boolean isAutoPort = isAutoPort();
data.setProperty(IPeerProperties.PROP_PROXIES, proxies);
if (addressControl != null) {
String host = addressControl.getEditFieldControlText();
data.setProperty(IPeer.ATTR_IP_HOST, !"".equals(host) ? host : null); //$NON-NLS-1$
}
if (portControl != null) {
String port = portControl.getEditFieldControlText();
if (isAutoPort) {
data.setProperty(IPeer.ATTR_IP_PORT, null);
}
else {
data.setProperty(IPeer.ATTR_IP_PORT, !"".equals(port) ? port : null); //$NON-NLS-1$
}
}
if (isAutoPort) {
data.setProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO, Boolean.TRUE.toString());
} else {
data.setProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO, null);
}
// Transport name is always "TCP"
data.setProperty(IPeer.ATTR_TRANSPORT_NAME, ITransportTypes.TRANSPORT_TYPE_TCP);
}
/**
* Stores the page widgets current values to the given peer node.
* <p>
* This method may called multiple times during the lifetime of the page and the given peer node
* might be even <code>null</code>.
*
* @param node The peer model node or <code>null</code>.
*/
public void extractData(final IPeerNode node) {
// If no data is available, we are done
if (node == null) {
return;
}
// The list of removed attributes
final List<String> removed = new ArrayList<String>();
// Get the current key set from the working copy
Set<String> currentKeySet = wc.getProperties().keySet();
extractData(wc);
// If the data has not changed compared to the original data copy,
// we are done here and return immediately
if (odc.equals(wc)) {
return;
}
// Get the new key set from the working copy
Set<String> newKeySet = wc.getProperties().keySet();
// Everything from the old key set not found in the new key set is a removed attribute
for (String key : currentKeySet) {
if (!newKeySet.contains(key)) {
removed.add(key);
}
}
// Copy the working copy data back to the original properties container
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
// To update the peer attributes, the peer needs to be recreated
IPeer oldPeer = node.getPeer();
// Create a write able copy of the peer attributes
Map<String, String> attributes = new HashMap<String, String>(oldPeer.getAttributes());
// Clean out the removed attributes
for (String key : removed) {
attributes.remove(key);
}
// Update with the current configured attributes
for (String key : wc.getProperties().keySet()) {
String value = wc.getStringProperty(key);
if (value != null) {
attributes.put(key, value);
}
else {
attributes.remove(key);
}
}
// If there is still a open channel to the old peer, close it by force
IChannel channel = Tcf.getChannelManager().getChannel(oldPeer);
if (channel != null) {
channel.close();
}
// Create the new peer
IPeer newPeer = new Peer(attributes);
// Update the peer node instance (silently)
boolean changed = node.setChangeEventsEnabled(false);
node.setProperty(IPeerNodeProperties.PROPERTY_INSTANCE, newPeer);
// As the transport changed, we have to reset the state back to "unknown"
// and clear out the services and DNS markers
node.setProperty("dns.name.transient", null); //$NON-NLS-1$
node.setProperty("dns.lastIP.transient", null); //$NON-NLS-1$
node.setProperty("dns.skip.transient", null); //$NON-NLS-1$
if (changed) {
node.setChangeEventsEnabled(true);
}
}
});
}
/*
* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#isValid()
*/
@Override
public boolean isValid() {
// Validation is skipped while the controls are updated
if (isUpdating()) return true;
boolean valid = super.isValid();
if (addressControl != null) {
valid &= addressControl.isValid();
if (addressControl.getMessageType() > getMessageType()) {
setMessage(addressControl.getMessage(), addressControl.getMessageType());
}
}
if (portControl != null) {
valid &= portControl.isValid();
if (portControl.getMessageType() > getMessageType()) {
setMessage(portControl.getMessage(), portControl.getMessageType());
}
}
return valid;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.AbstractFormPart#commit(boolean)
*/
@Override
public void commit(boolean onSave) {
// Remember the current dirty state
boolean needsSaving = isDirty();
// Call the super implementation (resets the dirty state)
super.commit(onSave);
// Nothing to do if not on save or saving is not needed
if (!onSave || !needsSaving) {
return;
}
// Extract the data into the original data node
extractData(od);
}
/**
* Called to signal that the data associated has been changed.
*
* @param e The event which triggered the invocation or <code>null</code>.
*/
public void dataChanged(TypedEvent e) {
// dataChanged is not evaluated while the controls are updated
if (isUpdating()) return;
boolean isDirty = false;
String transportType = wc.getStringProperty(IPeer.ATTR_TRANSPORT_NAME);
if ("".equals(transportType)) { //$NON-NLS-1$
String value = odc.getStringProperty(IPeer.ATTR_TRANSPORT_NAME);
isDirty |= value != null && !"".equals(value.trim()); //$NON-NLS-1$
}
else {
isDirty |= !odc.isProperty(IPeer.ATTR_TRANSPORT_NAME, transportType);
}
if (addressControl != null) {
String address = addressControl.getEditFieldControlText();
if (address != null) {
if ("".equals(address)) { //$NON-NLS-1$
isDirty |= odc.getStringProperty(IPeer.ATTR_IP_HOST) != null && !address.equals(odc.getStringProperty(IPeer.ATTR_IP_HOST));
} else {
isDirty |= !address.equals(odc.getStringProperty(IPeer.ATTR_IP_HOST));
}
}
}
boolean autoPort = odc.getBooleanProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO);
if (!autoPort && portControl != null) {
String port = portControl.getEditFieldControlText();
String oldPort = odc.getStringProperty(IPeer.ATTR_IP_PORT);
isDirty |= !port.equals(oldPort != null ? oldPort : ""); //$NON-NLS-1$
}
isDirty |= isAutoPort() != autoPort;
String newProxies = odc.getStringProperty(IPeerProperties.PROP_PROXIES);
if (proxies == null || proxies.trim().length() == 0) {
isDirty |= newProxies != null && newProxies.trim().length() > 0;
}
else {
isDirty |= newProxies == null || newProxies.trim().length() == 0;
}
// If dirty, mark the form part dirty.
// Otherwise call refresh() to reset the dirty (and stale) flag
markDirty(isDirty);
// Adjust the control enablement
updateEnablement();
}
/**
* Updates the given set of attributes with the current values of the page widgets.
*
* @param attributes The attributes to update. Must not be <code>null</code>:
*/
public void updateAttributes(IPropertiesContainer attributes) {
Assert.isNotNull(attributes);
attributes.setProperty(IPeerProperties.PROP_PROXIES, null);
attributes.setProperty(IPeer.ATTR_IP_HOST, null);
attributes.setProperty(IPeer.ATTR_IP_PORT, null);
attributes.setProperty(IPeerProperties.PROP_IP_PORT_IS_AUTO, null);
extractData(attributes);
}
/**
* Updates the control enablement.
*/
protected void updateEnablement() {
// Determine the input
final Object input = od; // getManagedForm().getInput();
boolean enabled = !isReadOnly() && (!(input instanceof IPeerNode) || ((IPeerNode)input).getConnectState() == IConnectable.STATE_DISCONNECTED);
if (proxyControl != null) {
proxyControl.setEnabled(enabled);
if (enabled) SWTControlUtil.setEnabled(proxyControl.getEditFieldControl(), false);
}
if (addressControl != null) addressControl.setEnabled(enabled);
if (portControl != null) portControl.setEnabled(enabled && !isAutoPort);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#saveWidgetValues(org.eclipse.jface.dialogs.IDialogSettings)
*/
@Override
public void saveWidgetValues(IDialogSettings settings) {
super.saveWidgetValues(settings);
if (settings != null) {
if (addressControl != null) addressControl.saveWidgetValues(settings, TcpTransportSection.class.getSimpleName());
if (portControl != null && !portControl.getEditFieldControlText().equals(getDefaultPort())) portControl.saveWidgetValues(settings, TcpTransportSection.class.getSimpleName());
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#restoreWidgetValues(org.eclipse.jface.dialogs.IDialogSettings)
*/
@Override
public void restoreWidgetValues(IDialogSettings settings) {
super.restoreWidgetValues(settings);
if (settings != null) {
if (addressControl != null) addressControl.restoreWidgetValues(settings, TcpTransportSection.class.getSimpleName());
if (portControl != null) portControl.restoreWidgetValues(settings, TcpTransportSection.class.getSimpleName());
}
}
}