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.
+
+