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