From 58e1c330a1d67c9a619921d148e4b229e5f8b375 Mon Sep 17 00:00:00 2001
From: Kushal Munir < kmunir@ca.ibm.com>
Date: Fri, 18 May 2007 00:53:52 +0000
Subject: [PATCH] [179937] [api] New control in property page for connection.
Added new API to IHost() to set and get default encodings and to
SystemConnectionForm to deal with encoding fields for connection "Host"
property page.
---
.../org/eclipse/rse/core/model/DummyHost.java | 8 +-
.../src/org/eclipse/rse/core/model/Host.java | 77 ++++++
.../src/org/eclipse/rse/core/model/IHost.java | 20 ++
.../FileServiceSubSystem.java | 28 ++-
.../core/subsystems/RemoteFileSubSystem.java | 20 +-
.../rse/internal/ui/SystemResources.java | 9 +
.../internal/ui/SystemResources.properties | 9 +
.../SystemConnectionPropertyPage.java | 17 ++
.../org/eclipse/rse/ui/ISystemMessages.java | 1 +
.../eclipse/rse/ui/SystemConnectionForm.java | 238 ++++++++++++++++++
.../org.eclipse.rse.ui/systemmessages.xml | 4 +
11 files changed, 426 insertions(+), 5 deletions(-)
diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/DummyHost.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/DummyHost.java
index de7be9c5373..948807b5771 100644
--- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/DummyHost.java
+++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/DummyHost.java
@@ -252,5 +252,11 @@ public class DummyHost extends PlatformObject implements IHost
public void setTainted(boolean flag) {
}
-
+
+ public String getDefaultEncoding(boolean checkRemote) {
+ return null;
+ }
+
+ public void setDefaultEncoding(String encoding, boolean fromRemote) {
+ }
}
\ No newline at end of file
diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/Host.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/Host.java
index 39a5e42909d..2862e923ce8 100644
--- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/Host.java
+++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/Host.java
@@ -48,6 +48,10 @@ public class Host extends RSEModelObject implements IHost {
private boolean userIdCaseSensitive = true;
private ISystemHostPool pool;
protected String previousUserIdKey;
+
+ private static final String ENCODING_PROPERTY_SET = "EncodingPropertySet"; //$NON-NLS-1$
+ private static final String ENCODING_REMOTE_PROPERTY_KEY = "EncodingRemotePropertyKey"; //$NON-NLS-1$
+ private static final String ENCODING_NON_REMOTE_PROPERTY_KEY = "EncodingNonRemotePropertyKey"; //$NON-NLS-1$
/**
* The system type which is associated to this IHost
object.
@@ -516,4 +520,77 @@ public class Host extends RSEModelObject implements IHost {
return result;
}
+ /**
+ * The default encoding of the host. If checkRemote is false
, returns the encoding that was not set by querying a remote system
+ * (for example, an encoding set by a user). If checkRemote is true
, it first checks to see if there is an encoding that was set
+ * without querying a remote system, and if an encoding does not exist, then it returns the encoding that was set by querying a remote system.
+ * @param checkRemote false
to get the encoding that was obtained by not querying the remote system, true
to also check
+ * the encoding, if needed, that was set by querying a remote system.
+ * @return the default encoding of the host, or null
if no encoding was set.
+ * @see #setDefaultEncoding(String, boolean)
+ */
+ public String getDefaultEncoding(boolean checkRemote) {
+
+ IPropertySet encPropertySet = getPropertySet(ENCODING_PROPERTY_SET);
+
+ if (encPropertySet == null) {
+ return null;
+ }
+ else {
+ String nonRemoteEncoding = encPropertySet.getPropertyValue(ENCODING_NON_REMOTE_PROPERTY_KEY);
+
+ if (nonRemoteEncoding != null) {
+ return nonRemoteEncoding;
+ }
+ else {
+
+ if (!checkRemote) {
+ return null;
+ }
+ else {
+ String remoteEncoding = encPropertySet.getPropertyValue(ENCODING_REMOTE_PROPERTY_KEY);
+ return remoteEncoding;
+ }
+ }
+ }
+ }
+
+ /**
+ * Sets the default encoding of the host. The encoding can be set by querying the remote system or by some other means (for example, by a user).
+ * @param encoding the encoding of the host, or null
to erase the current encoding.
+ * @param fromRemote true
if the encoding is set by querying the remote system, or false
otherwise.
+ * @see #getDefaultEncoding(boolean)
+ */
+ public void setDefaultEncoding(String encoding, boolean fromRemote) {
+
+ IPropertySet encPropertySet = getPropertySet(ENCODING_PROPERTY_SET);
+
+ if (encPropertySet == null) {
+ encPropertySet = createPropertySet(ENCODING_PROPERTY_SET);
+ }
+
+ if (encPropertySet != null) {
+
+ if (encoding != null) {
+
+ if (!fromRemote) {
+ encPropertySet.addProperty(ENCODING_NON_REMOTE_PROPERTY_KEY, encoding);
+ }
+ else {
+ encPropertySet.addProperty(ENCODING_REMOTE_PROPERTY_KEY, encoding);
+ }
+ }
+ else {
+
+ if (!fromRemote) {
+ encPropertySet.removeProperty(ENCODING_NON_REMOTE_PROPERTY_KEY);
+ }
+ else {
+ encPropertySet.removeProperty(ENCODING_REMOTE_PROPERTY_KEY);
+ }
+ }
+ }
+
+ commit();
+ }
}
\ No newline at end of file
diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java
index 3b567fc2f23..c67e8171fbe 100644
--- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java
+++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java
@@ -29,6 +29,7 @@ import org.eclipse.rse.core.subsystems.ISubSystem;
* object oriented containment.
*/
public interface IHost extends IAdaptable, IRSEModelObject {
+
/**
* Return the system profile that owns this connection
* @return the profile which contains this host
@@ -186,6 +187,25 @@ public interface IHost extends IAdaptable, IRSEModelObject {
* @return The value of the Promptable attribute
*/
boolean isPromptable();
+
+ /**
+ * The default encoding of the host. If checkRemote is false
, returns the encoding that was not set by querying a remote system
+ * (for example, an encoding set by a user). If checkRemote is true
, it first checks to see if there is an encoding that was set
+ * without querying a remote system, and if an encoding does not exist, then it returns the encoding that was set by querying a remote system.
+ * @param checkRemote false
to get the encoding that was obtained by not querying the remote system, true
to also check
+ * the encoding, if needed, that was set by querying a remote system.
+ * @return the default encoding of the host, or null
if no encoding was set.
+ * @see #setDefaultEncoding(String, boolean)
+ */
+ public String getDefaultEncoding(boolean checkRemote);
+
+ /**
+ * Sets the default encoding of the host. The encoding can be set by querying the remote system or by some other means (for example, by a user).
+ * @param encoding the encoding of the host, or null
to erase the current encoding.
+ * @param fromRemote true
if the encoding is set by querying the remote system, or false
otherwise.
+ * @see #getDefaultEncoding(boolean)
+ */
+ public void setDefaultEncoding(String encoding, boolean fromRemote);
/**
* Set the promptable attribute.
diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java
index 72688efbba7..7e4c4d8afd3 100644
--- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java
+++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java
@@ -745,11 +745,35 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I
* @see RemoteFileSubSystem#getRemoteEncoding()
*/
public String getRemoteEncoding() {
+
try {
- return getFileService().getEncoding(null);
- } catch (SystemMessageException e) {
+
+ IHost host = getHost();
+
+ // get the encoding from the host that was not set by the remote system
+ String encoding = host.getDefaultEncoding(false);
+
+ // get the encoding from the host that was set by querying a remote system
+ // this allows us to pick up the host encoding that may have been set by another subsystem
+ if (encoding == null) {
+ encoding = getFileService().getEncoding(null);
+
+ if (encoding != null) {
+ host.setDefaultEncoding(encoding, true);
+ }
+ }
+
+ if (encoding != null) {
+ return encoding;
+ }
+ else {
+ return super.getRemoteEncoding();
+ }
+ }
+ catch (SystemMessageException e) {
SystemBasePlugin.logMessage(e.getSystemMessage());
}
+
return super.getRemoteEncoding();
}
diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java
index ebd4cc65dfc..17be0b74ab0 100644
--- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java
+++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java
@@ -1443,11 +1443,27 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
/**
- * Returns the local platform encoding by default.
+ * Returns the local platform encoding if the default encoding of the host was not set.
* Subclasses should override to return the actual remote encoding.
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#getRemoteEncoding()
*/
public String getRemoteEncoding() {
- return System.getProperty("file.encoding"); //$NON-NLS-1$
+ IHost host = getHost();
+
+ // get the encoding from the host that was not by the remote system
+ String encoding = host.getDefaultEncoding(false);
+
+ // get the encoding from the host that was set by querying a remote system
+ // this allows us to pick up the host encoding that may have been set by another subsystem
+ if (encoding == null) {
+ encoding = host.getDefaultEncoding(true);
+ }
+
+ if (encoding != null) {
+ return encoding;
+ }
+ else {
+ return System.getProperty("file.encoding"); //$NON-NLS-1$
+ }
}
}
\ No newline at end of file
diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.java
index 4d514052d69..a3e75aeb1f2 100644
--- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.java
+++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.java
@@ -1221,6 +1221,15 @@ public class SystemResources extends NLS
public static String RESID_DO_NOT_SHOW_MESSAGE_AGAIN_LABEL;
public static String RESID_DO_NOT_SHOW_MESSAGE_AGAIN_TOOLTIP;
+ // Encoding
+ public static String RESID_HOST_ENCODING_GROUP_LABEL;
+ public static String RESID_HOST_ENCODING_SETTING_MSG;
+ public static String RESID_HOST_ENCODING_REMOTE_LABEL;
+ public static String RESID_HOST_ENCODING_REMOTE_TOOLTIP;
+ public static String RESID_HOST_ENCODING_OTHER_LABEL;
+ public static String RESID_HOST_ENCODING_OTHER_TOOLTIP;
+ public static String RESID_HOST_ENCODING_ENTER_TOOLTIP;
+
static {
// load message values from bundle file
NLS.initializeMessages(BUNDLE_NAME, SystemResources.class);
diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.properties b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.properties
index f0589ca46ed..9686ad9509f 100644
--- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.properties
+++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/SystemResources.properties
@@ -1419,3 +1419,12 @@ RESID_SERVICESFORM_PROPERTIES_TOOLTIP=Edit the properties of the item selected i
## Do not show this message again
RESID_DO_NOT_SHOW_MESSAGE_AGAIN_LABEL = Do not show this message again
RESID_DO_NOT_SHOW_MESSAGE_AGAIN_TOOLTIP = Select this option if you do not want to see this message again
+
+# Strings for Encodings
+RESID_HOST_ENCODING_GROUP_LABEL=Default encoding
+RESID_HOST_ENCODING_SETTING_MSG=This setting can only be changed when no subsystem is connected
+RESID_HOST_ENCODING_REMOTE_LABEL=Default from remote system
+RESID_HOST_ENCODING_REMOTE_TOOLTIP=The default encoding of the platform obtained from the remote system
+RESID_HOST_ENCODING_OTHER_LABEL=Other:
+RESID_HOST_ENCODING_OTHER_TOOLTIP=Specify a different encoding
+RESID_HOST_ENCODING_ENTER_TOOLTIP=Select or enter an encoding
diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/propertypages/SystemConnectionPropertyPage.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/propertypages/SystemConnectionPropertyPage.java
index 019ecc553c5..b58001b2978 100644
--- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/propertypages/SystemConnectionPropertyPage.java
+++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/propertypages/SystemConnectionPropertyPage.java
@@ -64,6 +64,8 @@ public class SystemConnectionPropertyPage extends SystemBasePropertyPage
// prepare input data
IHost conn = (IHost)getElement();
form.initializeInputFields(conn);
+ // add encoding fields
+ form.addDefaultEncodingFields();
// create validators
ISystemValidator connectionNameValidators[] = new ISystemValidator[1];
connectionNameValidators[0] = SystemConnectionForm.getConnectionNameValidator(conn);
@@ -98,6 +100,21 @@ public class SystemConnectionPropertyPage extends SystemBasePropertyPage
form.getConnectionDescription(), form.getDefaultUserId(),
form.getUserIdLocation() );
+ // update encoding
+ String encoding = form.getDefaultEncoding();
+ boolean isRemoteEncoding = form.isEncodingRemoteDefault();
+
+ // user set encoding
+ if (!isRemoteEncoding) {
+ conn.setDefaultEncoding(encoding, false);
+ }
+ // remote default encoding
+ else {
+ // remove user encoding from host property first
+ conn.setDefaultEncoding(null, false);
+ // remove default remote encoding to indicate to get from remote system
+ conn.setDefaultEncoding(null, true);
+ }
boolean offlineSelection = form.isWorkOffline();
if (offlineSelection != conn.isOffline())
diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/ISystemMessages.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/ISystemMessages.java
index fa8c1e28be8..d64c892f1d6 100644
--- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/ISystemMessages.java
+++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/ISystemMessages.java
@@ -270,6 +270,7 @@ public interface ISystemMessages
public static final String MSG_OPERTION_STOPPED = "RSEG1257"; //$NON-NLS-1$
public static final String MSG_OPERATION_DISCONNECTED = "RSEG1258"; //$NON-NLS-1$
+ public static final String MSG_ENCODING_NOT_SUPPORTED = "RSEG1244"; //$NON-NLS-1$
// --------------------------
diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/SystemConnectionForm.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/SystemConnectionForm.java
index ba1d47612e9..64d2d5e587f 100644
--- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/SystemConnectionForm.java
+++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/SystemConnectionForm.java
@@ -26,6 +26,8 @@ package org.eclipse.rse.ui;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
@@ -55,20 +57,27 @@ import org.eclipse.rse.ui.validators.ValidatorUserId;
import org.eclipse.rse.ui.widgets.InheritableEntryField;
import org.eclipse.rse.ui.wizards.AbstractSystemWizardPage;
import org.eclipse.rse.ui.wizards.newconnection.RSEAbstractNewConnectionWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
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.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.Event;
+import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.ide.IDEEncoding;
/**
* A reusable form for prompting for connection information,
@@ -86,6 +95,7 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
public static final boolean CREATE_MODE = false;
public static final boolean UPDATE_MODE = true;
public static IRSESystemType lastSystemType = null;
+ protected IHost conn;
protected IRSESystemType defaultSystemType;
protected IRSESystemType[] validSystemTypes;
@@ -95,6 +105,9 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
protected Combo textSystemType, textHostName, profileCombo;
protected Text textConnectionName, textDescription;
protected Button verifyHostNameCB;
+ protected Group encodingGroup;
+ protected Button remoteEncodingButton, otherEncodingButton;
+ protected Combo otherEncodingCombo;
// yantzi:artemis 6.0, work offline support
protected Button workOfflineCB;
@@ -136,6 +149,12 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
protected String currentHostName = null;
protected SystemMessage errorMessage = null;
protected SystemMessage verifyingHostName;
+
+ // encoding fields
+ protected boolean addEncodingFields = false;
+ protected String defaultEncoding = null;
+ protected boolean isRemoteEncoding = false;
+ protected boolean isValidBefore = true;
/**
* Constructor.
@@ -304,6 +323,7 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
*/
public void initializeInputFields(IHost conn, boolean updateMode) {
this.updateMode = updateMode;
+ this.conn = conn;
defaultSystemType = conn.getSystemType();
defaultConnectionName = conn.getAliasName();
defaultHostName = conn.getHostName();
@@ -311,6 +331,15 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
defaultDescription = conn.getDescription();
defaultProfile = conn.getSystemProfile().getName();
defaultWorkOffline = conn.isOffline();
+ defaultEncoding = conn.getDefaultEncoding(false);
+
+ if (defaultEncoding == null) {
+ defaultEncoding = conn.getDefaultEncoding(true);
+ isRemoteEncoding = true;
+ }
+ else {
+ isRemoteEncoding = false;
+ }
if (updateMode) {
defaultProfileNames = new String[1];
@@ -443,6 +472,15 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
}
}
}
+
+ // validate host name...
+ if ((errorMessage == null) && addEncodingFields) {
+ errorMessage = validateEncoding();
+
+ if (errorMessage != null) {
+ controlInError = otherEncodingCombo;
+ }
+ }
// if ok pressed, test for warning situation that connection name is in use in another profile...
if (ok && (errorMessage == null) && okPressed) {
@@ -771,6 +809,69 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
if (textUserId == null)
userIdLocation = IRSEUserIdConstants.USERID_LOCATION_NOTSET;
+
+ // check if an encodings field should be added
+ if (addEncodingFields) {
+
+ SystemWidgetHelpers.createLabel(composite_prompts, "", 2); //$NON-NLS-1$
+
+ // encoding field
+ encodingGroup = SystemWidgetHelpers.createGroupComposite(composite_prompts, 2, SystemResources.RESID_HOST_ENCODING_GROUP_LABEL);
+ GridData data = new GridData();
+ data.horizontalSpan = 2;
+ data.horizontalAlignment = SWT.BEGINNING;
+ data.grabExcessHorizontalSpace = true;
+ data.verticalAlignment = SWT.BEGINNING;
+ data.grabExcessVerticalSpace = false;
+ encodingGroup.setLayoutData(data);
+
+ SelectionAdapter buttonSelectionListener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ updateEncodingGroupState(remoteEncodingButton.getSelection());
+ validateEncoding();
+ }
+ };
+
+ SystemWidgetHelpers.createLabel(encodingGroup, SystemResources.RESID_HOST_ENCODING_SETTING_MSG, 2);
+
+ // remote encoding field
+ String defaultEncodingLabel = SystemResources.RESID_HOST_ENCODING_REMOTE_LABEL;
+
+ remoteEncodingButton = SystemWidgetHelpers.createRadioButton(encodingGroup, null, defaultEncodingLabel, SystemResources.RESID_HOST_ENCODING_REMOTE_TOOLTIP);
+ data = new GridData();
+ data.horizontalSpan = 2;
+ remoteEncodingButton.setLayoutData(data);
+ remoteEncodingButton.addSelectionListener(buttonSelectionListener);
+
+ // other encoding field
+ otherEncodingButton = SystemWidgetHelpers.createRadioButton(encodingGroup, null, SystemResources.RESID_HOST_ENCODING_OTHER_LABEL, SystemResources.RESID_HOST_ENCODING_OTHER_TOOLTIP);
+ data = new GridData();
+ data.grabExcessHorizontalSpace = false;
+ otherEncodingButton.setLayoutData(data);
+ otherEncodingButton.addSelectionListener(buttonSelectionListener);
+
+ // other encoding combo
+ otherEncodingCombo = SystemWidgetHelpers.createCombo(encodingGroup, null, SystemResources.RESID_HOST_ENCODING_ENTER_TOOLTIP);
+ data = new GridData();
+ data.horizontalAlignment = SWT.BEGINNING;
+ data.grabExcessHorizontalSpace = true;
+ data.horizontalIndent = 0;
+ otherEncodingCombo.setLayoutData(data);
+
+ otherEncodingCombo.addSelectionListener(new SelectionAdapter(){
+ public void widgetSelected(SelectionEvent e) {
+ validateEncoding();
+ }
+ });
+
+ otherEncodingCombo.addKeyListener(new KeyAdapter(){
+ public void keyReleased(KeyEvent e) {
+ validateEncoding();
+ }
+ });
+
+ SystemWidgetHelpers.createLabel(composite_prompts, "", 2); //$NON-NLS-1$
+ }
doInitializeFields();
@@ -778,6 +879,68 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
return composite_prompts; // composite;
}
+
+ /**
+ * Update the encoding group state.
+ * @param useDefault whether to update the state with default option on. true
if the default option
+ * should be on, false
if it should be off.
+ */
+ private void updateEncodingGroupState(boolean useDefault) {
+ remoteEncodingButton.setSelection(useDefault);
+ otherEncodingButton.setSelection(!useDefault);
+
+ if (useDefault) {
+
+ if (defaultEncoding != null) {
+ otherEncodingCombo.setText(defaultEncoding);
+ }
+ else {
+ otherEncodingCombo.setText(System.getProperty("file.encoding")); //$NON-NLS-1$
+ }
+ }
+
+ otherEncodingCombo.setEnabled(!useDefault);
+ validateEncoding();
+ }
+
+ /**
+ * Updates the valid state of the encoding group.
+ */
+ private SystemMessage validateEncoding() {
+ boolean isValid = isEncodingValid();
+
+ errorMessage = null;
+
+ if (!isValid) {
+ errorMessage = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_ENCODING_NOT_SUPPORTED);
+ }
+
+ showErrorMessage(errorMessage);
+ setPageComplete();
+ return errorMessage;
+ }
+
+ /**
+ * Returns whether the encoding is valid.
+ * @return true
if the encoding is valid, false
otherwise.
+ */
+ private boolean isEncodingValid() {
+ return remoteEncodingButton.getSelection() || isEncodingValid(otherEncodingCombo.getText());
+ }
+
+ /**
+ * Returns whether or not the given encoding is valid.
+ * @param encoding the encoding.
+ * @return true
if the encoding is valid, false
otherwise.
+ */
+ private boolean isEncodingValid(String encoding) {
+ try {
+ return Charset.isSupported(encoding);
+ }
+ catch (IllegalCharsetNameException e) {
+ return false;
+ }
+ }
/**
* Return control to recieve initial focus
@@ -995,6 +1158,31 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
if (workOfflineCB != null) {
workOfflineCB.setSelection(defaultWorkOffline);
}
+
+ // the file encoding group
+ if (addEncodingFields) {
+ List encodings = IDEEncoding.getIDEEncodings();
+ String[] encodingStrings = new String[encodings.size()];
+ encodings.toArray(encodingStrings);
+ otherEncodingCombo.setItems(encodingStrings);
+
+ // if the encoding is the same as the default encoding, then we want to choose the default encoding option
+ if (isRemoteEncoding) {
+ updateEncodingGroupState(true);
+ }
+ // otherwise choose the other encoding option
+ else {
+ otherEncodingCombo.setText(defaultEncoding);
+ updateEncodingGroupState(false);
+ }
+
+ ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
+
+ // disable if any subsystem is connected
+ if (!conn.getSystemType().getId().equalsIgnoreCase(IRSESystemType.SYSTEMTYPE_LOCAL_ID) && sr.isAnySubSystemConnected(conn)) {
+ encodingGroup.setEnabled(false);
+ }
+ }
verify(false);
}
@@ -1231,4 +1419,54 @@ public class SystemConnectionForm implements Listener, SelectionListener, Runnab
}
pm.done();
}
+
+ /**
+ * Add fields to enable encoding for the host to be set. This form will not have any encoding fields unless this is called.
+ */
+ public void addDefaultEncodingFields() {
+ addEncodingFields = true;
+ }
+
+ /**
+ * Returns the encoding that was specified. Only applies if encoding fields were added to this form.
+ * @return the encoding that was specified. This will return null
if the selection is to use the encoding from the remote system
+ * but that encoding has not been obtained yet.
+ * @see #addDefaultEncodingFields()
+ */
+ public String getDefaultEncoding() {
+
+ if (addEncodingFields) {
+ return getSelectedEncoding();
+ }
+ else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the currently selected encoding.
+ * @return the currently selected encoding.
+ */
+ private String getSelectedEncoding() {
+ if (remoteEncodingButton.getSelection()) {
+ return defaultEncoding;
+ }
+
+ return otherEncodingCombo.getText();
+ }
+
+ /**
+ * Returns whether the encoding option is to use the encoding of the remote system. Only applies if encoding fields were added to this form.
+ * @return true
if the encoding option is to use the encoding of the remote system, false
if the user specified the encoding.
+ * @see #addDefaultEncodingFields()
+ */
+ public boolean isEncodingRemoteDefault() {
+
+ if (addEncodingFields) {
+ return remoteEncodingButton.getSelection();
+ }
+ else {
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/rse/plugins/org.eclipse.rse.ui/systemmessages.xml b/rse/plugins/org.eclipse.rse.ui/systemmessages.xml
index 962a57d797d..056a5268edb 100644
--- a/rse/plugins/org.eclipse.rse.ui/systemmessages.xml
+++ b/rse/plugins/org.eclipse.rse.ui/systemmessages.xml
@@ -684,6 +684,10 @@ Contributors:
Failed to connect to the daemon on %1 using port %2 with an unexpected exception
%3
+
+ The selected encoding is not supported.
+
+