Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/EncodingFieldEditor.java')
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/EncodingFieldEditor.java282
1 files changed, 282 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/EncodingFieldEditor.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/EncodingFieldEditor.java
new file mode 100644
index 000000000..a9f8ab63a
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/EncodingFieldEditor.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ccvs.ui.repo;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collections;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
+
+/**
+ * A field editor that allows the user to choose an encoding.
+ */
+public class EncodingFieldEditor extends FieldEditor {
+ private Composite container;
+ private Button defaultEncodingButton;
+ private String defaultEnc;
+ private Button otherEncodingButton;
+ private Combo encodingCombo;
+ private boolean isValid = true;
+ private String oldSelectedEncoding;
+
+ /**
+ * Create an encoding filed editor.
+ * @param name the name of the preference this field editor works on
+ * @param labelText the label text of the field editor
+ * @param parent the parent of the field editor's control
+ */
+ public EncodingFieldEditor(String name, String labelText, Composite parent) {
+ super(name, labelText, parent);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
+ */
+ protected void adjustForNumColumns(int numColumns) {
+ ((GridData)getContainer().getLayoutData()).horizontalSpan = numColumns;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
+ */
+ protected void doFillIntoGrid(Composite parent, int numColumns) {
+ container = createEncodingGroup(parent, numColumns);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#doLoad()
+ */
+ protected void doLoad() {
+ if (encodingCombo != null) {
+ String value = getPreferenceStore().getString(getPreferenceName());
+ if (value.equals(defaultEnc)) {
+ doLoadDefault();
+ } else {
+ encodingCombo.setText(value);
+ oldSelectedEncoding = value;
+ updateEncodingState(false);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
+ */
+ protected void doLoadDefault() {
+ updateEncodingState(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#doStore()
+ */
+ protected void doStore() {
+ String encoding = getSelectedEncoding();
+ if (encoding.equals(defaultEnc)) {
+ getPreferenceStore().setToDefault(getPreferenceName());
+ } else {
+ getPreferenceStore().setValue(getPreferenceName(), encoding);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
+ */
+ public int getNumberOfControls() {
+ return 1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#isValid()
+ */
+ public boolean isValid() {
+ return isValid;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
+ */
+ protected void refreshValidState() {
+ updateValidState();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.FieldEditor#setPreferenceStore(org.eclipse.jface.preference.IPreferenceStore)
+ */
+ public void setPreferenceStore(IPreferenceStore store) {
+ super.setPreferenceStore(store);
+ defaultEnc = store.getDefaultString(getPreferenceName());
+ updateDefaultEncoding();
+ }
+
+ private void updateDefaultEncoding() {
+ defaultEncodingButton.setText(IDEWorkbenchMessages.format("WorkbenchPreference.defaultEncoding", new String[] { defaultEnc })); //$NON-NLS-1$
+ }
+
+ private Composite getContainer() {
+ return container;
+ }
+
+ private Group createEncodingGroup(Composite parent, int numColumns) {
+
+ Font font = parent.getFont();
+ Group group = new Group(parent, SWT.NONE);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = numColumns;
+ group.setLayoutData(data);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ group.setLayout(layout);
+ group.setText(getLabelText()); //$NON-NLS-1$
+ group.setFont(font);
+
+ SelectionAdapter buttonListener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ updateEncodingState(defaultEncodingButton.getSelection());
+ updateValidState();
+ }
+ };
+
+ if (defaultEnc == null) {
+ defaultEnc = System.getProperty("file.encoding", "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ defaultEncodingButton = new Button(group, SWT.RADIO);
+ updateDefaultEncoding();
+ data = new GridData();
+ data.horizontalSpan = 2;
+ defaultEncodingButton.setLayoutData(data);
+ defaultEncodingButton.addSelectionListener(buttonListener);
+ defaultEncodingButton.setFont(font);
+
+ otherEncodingButton = new Button(group, SWT.RADIO);
+ otherEncodingButton.setText(IDEWorkbenchMessages.getString("WorkbenchPreference.otherEncoding")); //$NON-NLS-1$
+ otherEncodingButton.addSelectionListener(buttonListener);
+ otherEncodingButton.setFont(font);
+
+ encodingCombo = new Combo(group, SWT.NONE);
+ encodingCombo.setFont(font);
+ data = new GridData();
+ data.widthHint = convertWidthInCharsToPixels(encodingCombo, 15);
+ encodingCombo.setLayoutData(data);
+ encodingCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateValidState();
+ }
+ });
+ encodingCombo.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ updateValidState();
+ }
+ });
+
+ ArrayList encodings = new ArrayList();
+ int n = 0;
+ try {
+ n = Integer.parseInt(IDEWorkbenchMessages.getString("WorkbenchPreference.numDefaultEncodings")); //$NON-NLS-1$
+ }
+ catch (NumberFormatException e) {
+ // Ignore;
+ }
+ for (int i = 0; i < n; ++i) {
+ String enc = IDEWorkbenchMessages.getString("WorkbenchPreference.defaultEncoding" + (i+1), null); //$NON-NLS-1$
+ if (enc != null) {
+ encodings.add(enc);
+ }
+ }
+
+ if (!encodings.contains(defaultEnc)) {
+ encodings.add(defaultEnc);
+ }
+
+ String enc = ResourcesPlugin.getPlugin().getPluginPreferences().getString(ResourcesPlugin.PREF_ENCODING);
+ boolean isDefault = enc == null || enc.length() == 0;
+
+ if (!isDefault && !encodings.contains(enc)) {
+ encodings.add(enc);
+ }
+ Collections.sort(encodings);
+ for (int i = 0; i < encodings.size(); ++i) {
+ encodingCombo.add((String) encodings.get(i));
+ }
+
+ encodingCombo.setText(isDefault ? defaultEnc : enc);
+
+ updateEncodingState(isDefault);
+ return group;
+ }
+
+ private int convertWidthInCharsToPixels(Control control, int chars) {
+ GC gc= new GC(control);
+ gc.setFont(control.getFont());
+ FontMetrics fontMetrics = gc.getFontMetrics();
+ int result = Dialog.convertWidthInCharsToPixels(fontMetrics, chars);
+ gc.dispose();
+ return result;
+ }
+
+ private void updateEncodingState(boolean useDefault) {
+ defaultEncodingButton.setSelection(useDefault);
+ otherEncodingButton.setSelection(!useDefault);
+ encodingCombo.setEnabled(!useDefault);
+ updateValidState();
+ }
+
+ private void updateValidState() {
+ boolean isValidNow = isEncodingValid();
+ if (isValidNow != isValid) {
+ isValid = isValidNow;
+ if (isValid) {
+ clearErrorMessage();
+ } else {
+ showErrorMessage(IDEWorkbenchMessages.getString("WorkbenchPreference.unsupportedEncoding")); //$NON-NLS-1$
+ }
+ fireStateChanged(IS_VALID, !isValid, isValid);
+
+ String newValue = getSelectedEncoding();
+ if (isValid && !newValue.equals(oldSelectedEncoding)) {
+ fireValueChanged(VALUE, oldSelectedEncoding, newValue);
+ oldSelectedEncoding = newValue;
+ }
+ }
+ }
+
+ private String getSelectedEncoding() {
+ if (defaultEncodingButton.getSelection()) {
+ return defaultEnc;
+ }
+ else {
+ return encodingCombo.getText();
+ }
+ }
+
+ private boolean isEncodingValid() {
+ return defaultEncodingButton.getSelection() ||
+ isValidEncoding(encodingCombo.getText());
+ }
+
+ private boolean isValidEncoding(String enc) {
+ try {
+ new String(new byte[0], enc);
+ return true;
+ } catch (UnsupportedEncodingException e) {
+ return false;
+ }
+ }
+}

Back to the top