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