org.eclipse.datatools.sqltools.result.internal.preference.ExportFormatPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.datatools.sqltools.result.internal.preference.ExportFormatPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2005 Sybase, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.datatools.sqltools.result.internal.preference;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;

import org.eclipse.datatools.help.ContextProviderDelegate;
import org.eclipse.datatools.help.HelpUtil;
import org.eclipse.datatools.sqltools.result.internal.export.OutputterConstants;
import org.eclipse.datatools.sqltools.result.internal.ui.Messages;
import org.eclipse.datatools.sqltools.result.internal.ui.PreferenceConstants;
import org.eclipse.datatools.sqltools.result.internal.ui.utils.UIUtil;
import org.eclipse.datatools.sqltools.result.ui.IHelpConstants;
import org.eclipse.datatools.sqltools.result.ui.ResultsViewUIPlugin;
import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

/**
 * Preference page for export format options
 * 
 * @author Dafan Yang 
 */
public class ExportFormatPreferencePage extends PreferencePage
        implements IWorkbenchPreferencePage, IContextProvider {
    // Resource bundle strings used in this page
    private static String XML_EXPORT_FORMAT;
    private static String ADD_XML_HEADER;
    private static String XML_HEADER;
    private static String ADD_XML_ROOT_TAG;
    private static String XML_ROOT_TAG;

    private static String DEFAULT_COLUMN_DELIMITER;
    private static String OUTPUT_FORMAT;
    private static String DELIMINTER;

    private static String COLUMN_ALIGNED;
    private static String COMMA_SEPARATED;
    private static String TAB_DELIMITED;
    private static String USER_DEFINED;

    private static String DEFAULT_FILE_ENCODING;
    private static String DEFAULT_ENCODING;
    private static String DEFAULT_ENCODING_STR = "UTF-8";
    private static String OTHER_ENCODING;

    private ContextProviderDelegate contextProviderDelegate = new ContextProviderDelegate(
            ResultsViewUIPlugin.getDefault().getBundle().getSymbolicName());

    public IContext getContext(Object target) {
        return contextProviderDelegate.getContext(target);
    }

    public int getContextChangeMask() {
        return contextProviderDelegate.getContextChangeMask();
    }

    public String getSearchExpression(Object target) {
        return contextProviderDelegate.getSearchExpression(target);
    }

    // Combo box items
    private String[] OUTPUT_FORMATS = { COLUMN_ALIGNED, COMMA_SEPARATED, TAB_DELIMITED, USER_DEFINED };

    Button _addXMLHeader = null;
    Label _xmlHeaderLabel = null;
    Text _xmlHeader = null;
    Label _xmlRootTagLabel = null;
    Button _addXMLRootTag = null;
    Text _xmlRootTag = null;
    Combo _outputFormat = null;
    Label _outputFormatLabel = null;
    Text _delimiter = null;
    Label _delimiterLabel = null;

    Button _defaultEncoding = null;
    Button _otherEncoding = null;
    Combo _fileEncoding = null;

    static {
        // Get strings from resource bundle
        XML_EXPORT_FORMAT = Messages.ExportFormatPage_xmlexportformat_group;
        ADD_XML_HEADER = Messages.ExportFormatPage_xmlexportformat_addxmlheader;
        XML_HEADER = Messages.ExportFormatPage_xmlexportformat_xmlheader;
        ADD_XML_ROOT_TAG = Messages.ExportFormatPage_xmlexportformat_addxmlroottag;
        XML_ROOT_TAG = Messages.ExportFormatPage_xmlexportformat_xmlroottag;

        DEFAULT_COLUMN_DELIMITER = Messages.ExportFormatPage_columndelimiter_group;
        OUTPUT_FORMAT = Messages.ExportFormatPage_columndelimiter_outputformat;
        DELIMINTER = Messages.ExportFormatPage_columndelimiter_delimiter;

        COLUMN_ALIGNED = Messages.ExportFormatPage_columndelimiter_items_columnaligned;
        COMMA_SEPARATED = Messages.ExportFormatPage_columndelimiter_items_commaseparated;
        TAB_DELIMITED = Messages.ExportFormatPage_columndelimiter_items_tabdelimited;
        USER_DEFINED = Messages.ExportFormatPage_columndelimiter_items_userdefined;

        DEFAULT_FILE_ENCODING = Messages.ExportFormatPage_fileencoding_group;
        DEFAULT_ENCODING = Messages.ExportFormatPage_fileencoding_defaultencoding;
        OTHER_ENCODING = Messages.ExportFormatPage_fileencoding_otherencoding;
    }

    public ExportFormatPreferencePage() {
        super(Messages.ExportFormatPage_title);
        setPreferenceStore(ResultsViewUIPlugin.getDefault().getPreferenceStore());
    }

    protected Control createContents(Composite parent) {
        getShell().setData(HelpUtil.CONTEXT_PROVIDER_KEY, this);
        HelpUtil.setHelp(parent, HelpUtil.getContextId(IHelpConstants.PREFERENCE_PAGE_EXPORT_FORMAT,
                ResultsViewUIPlugin.getDefault().getBundle().getSymbolicName()));

        // xml export format
        createXMLExportFormat(parent);

        // column delimiter
        createDelimiterGroup(parent);

        // file encoding
        createEncodingGroup(parent);

        // init
        initializeValues();
        updateEnablement();

        return new Composite(parent, SWT.NULL);
    }

    private void createXMLExportFormat(Composite parent) {
        Group xmlGroup = UIUtil.createGroup(parent, XML_EXPORT_FORMAT, 2);

        _addXMLHeader = UIUtil.createCheckBox(xmlGroup, ADD_XML_HEADER, 2);
        _addXMLHeader.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateXMLExportFormatEnablement();
            }
        });
        _xmlHeaderLabel = UIUtil.createLabel(xmlGroup, XML_HEADER, 1, 20);
        _xmlHeader = UIUtil.createTextBox(xmlGroup, 1);
        _xmlHeader.setEditable(false);
        _xmlHeader.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        _addXMLRootTag = UIUtil.createCheckBox(xmlGroup, ADD_XML_ROOT_TAG, 2);
        _addXMLRootTag.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateXMLExportFormatEnablement();
            }
        });
        _xmlRootTagLabel = UIUtil.createLabel(xmlGroup, XML_ROOT_TAG, 1, 20);
        _xmlRootTag = UIUtil.createTextBox(xmlGroup, 1);
        _xmlRootTag.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    }

    private void createDelimiterGroup(Composite parent) {
        Group delimiterGroup = UIUtil.createGroup(parent, DEFAULT_COLUMN_DELIMITER, 2);

        _outputFormatLabel = UIUtil.createLabel(delimiterGroup, OUTPUT_FORMAT, 1);
        _outputFormat = UIUtil.createCombo(delimiterGroup, OUTPUT_FORMATS, 1, 90);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        _outputFormat.setLayoutData(gd);
        _outputFormat.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateDelimiter();
            }
        });

        _delimiterLabel = UIUtil.createLabel(delimiterGroup, DELIMINTER, 1);
        _delimiter = UIUtil.createTextBox(delimiterGroup, 1);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        _delimiter.setLayoutData(gd);
    }

    private void createEncodingGroup(Composite parent) {
        Font font = parent.getFont();
        Group group = new Group(parent, SWT.NONE);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        group.setLayoutData(data);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        group.setLayout(layout);
        group.setText(DEFAULT_FILE_ENCODING); //$NON-NLS-1$
        group.setFont(font);

        SelectionAdapter buttonListener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateEncodingState(_defaultEncoding.getSelection());
                // updateValidState();
            }
        };

        _defaultEncoding = new Button(group, SWT.RADIO);

        //FIX BZ 130887, use 'UTF-8' as the default encoding
        String defaultEnc = DEFAULT_ENCODING_STR;

        _defaultEncoding.setText(NLS.bind(DEFAULT_ENCODING, new String[] { defaultEnc }));

        data = new GridData();
        data.horizontalSpan = 2;
        _defaultEncoding.setLayoutData(data);
        _defaultEncoding.addSelectionListener(buttonListener);
        _defaultEncoding.setFont(font);

        _otherEncoding = new Button(group, SWT.RADIO);
        _otherEncoding.setText(OTHER_ENCODING); //$NON-NLS-1$
        _otherEncoding.addSelectionListener(buttonListener);
        _otherEncoding.setFont(font);

        _fileEncoding = new Combo(group, SWT.NONE);
        data = new GridData();
        data.widthHint = convertWidthInCharsToPixels(15);
        _fileEncoding.setFont(font);
        _fileEncoding.setLayoutData(data);

        _fileEncoding.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                updateValidState();
                if (!_defaultEncoding.getSelection()) {
                    String xmlHeaderFormat = Messages.ExportFormatPage_xmlexportformat_xmlheader_text;
                    String xmlHeader = NLS.bind(xmlHeaderFormat, new String[] { _fileEncoding.getText() });
                    _xmlHeader.setText(xmlHeader);
                }
            }
        });

        _fileEncoding.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                String xmlHeaderFormat = Messages.ExportFormatPage_xmlexportformat_xmlheader_text;
                String xmlHeader = NLS.bind(xmlHeaderFormat, new String[] { _fileEncoding.getText() });
                _xmlHeader.setText(xmlHeader);
            }
        });

        ArrayList encodings = new ArrayList();
        int n = 0;
        try {
            n = Integer.parseInt(Messages.ExportFormatPage_fileencoding_numDefaultEncodings);
        } catch (NumberFormatException e) {
            // Ignore;
        }
        for (int i = 0; i < n; ++i) {
            String enc = Messages.getString("ExportFormatPage_fileencoding_defaultEncoding" + (i + 1)); //$NON-NLS-1$
            if (enc != null) {
                encodings.add(enc);
            }
        }

        if (!encodings.contains(defaultEnc)) {
            encodings.add(defaultEnc);
        }

        String enc = getPreferenceStore().getString(PreferenceConstants.EXPORT_FORMAT_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) {
            _fileEncoding.add((String) encodings.get(i));
        }

        _fileEncoding.setText(isDefault ? defaultEnc : enc);
        updateEncodingState(isDefault);
    }

    protected IPreferenceStore doGetPreferenceStore() {
        return ResultsViewUIPlugin.getDefault().getPreferenceStore();
    }

    protected void performDefaults() {
        super.performDefaults();
        IPreferenceStore store = getPreferenceStore();
        _addXMLHeader.setSelection(store.getDefaultBoolean(PreferenceConstants.EXPORT_FORMAT_ADD_XML_HEADER));
        _xmlHeader.setText(store.getDefaultString(PreferenceConstants.EXPORT_FORMAT_XML_HEADER));
        _addXMLRootTag.setSelection(store.getDefaultBoolean(PreferenceConstants.EXPORT_FORMAT_ADD_XML_ROOT_TAG));
        _xmlRootTag.setText(store.getDefaultString(PreferenceConstants.EXPORT_FORMAT_XML_ROOT_TAG));
        _outputFormat.select(store.getDefaultInt(PreferenceConstants.EXPORT_FORMAT_OUTPUT_FORMAT));
        _delimiter.setText(store.getDefaultString(PreferenceConstants.EXPORT_FORMAT_DELIMITER));
        _defaultEncoding.setSelection(store.getDefaultBoolean(PreferenceConstants.EXPORT_FORMAT_DEFAULT_ENCODEING));
        _otherEncoding.setSelection(store.getDefaultBoolean(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING));
        _fileEncoding.select(store.getDefaultInt(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING_SELECTION));
        store.setValue(PreferenceConstants.EXPORT_FORMAT_DELIMITER,
                OutputterConstants.DEFAULT_USER_DEFINED_DEMILITER);

        updateEnablement();
    }

    private void updateEnablement() {
        updateXMLExportFormatEnablement();
        updateDelimiter();
        updateEncodingEnablement();
    }

    private void updateXMLExportFormatEnablement() {
        boolean enabled = _addXMLHeader.getSelection();
        _xmlHeader.setEnabled(enabled);
        _xmlHeaderLabel.setEnabled(enabled);

        enabled = _addXMLRootTag.getSelection();
        _xmlRootTag.setEnabled(enabled);
        _xmlRootTagLabel.setEnabled(enabled);
    }

    private void updateDelimiter() {
        int delimiterIndex = _outputFormat.getSelectionIndex();
        switch (delimiterIndex) {
        case 0:
            _delimiter.setEditable(false);
            _delimiter.setTextLimit(OutputterConstants.USER_DEFINED_DELIMITER_COUNT * 4);
            _delimiter.setText(OutputterConstants.DELIMITER_COLUMN);
            break;
        case 1:
            _delimiter.setText(OutputterConstants.DELIMITER_COMMA);
            _delimiter.setEditable(false);
            break;
        case 2:
            _delimiter.setEditable(false);
            _delimiter.setTextLimit(OutputterConstants.USER_DEFINED_DELIMITER_COUNT * 4);
            _delimiter.setText(OutputterConstants.DELIMITER_TAB);
            break;
        case 3:
            _delimiter.setEditable(true);
            _delimiter.setTextLimit(OutputterConstants.USER_DEFINED_DELIMITER_COUNT);
            _delimiter.setText(ResultsViewUIPlugin.getDefault().getPreferenceStore()
                    .getString(PreferenceConstants.EXPORT_FORMAT_DELIMITER));
            break;
        default:
            _delimiter.setEditable(true);
            _delimiter.setTextLimit(OutputterConstants.USER_DEFINED_DELIMITER_COUNT * 4);
            _delimiter.setText(OutputterConstants.DELIMITER_COLUMN);
        }
    }

    private void updateEncodingEnablement() {
        boolean enabled = _defaultEncoding.getSelection();
        _fileEncoding.setEnabled(!enabled);
        updateValidState();
    }

    private void updateEncodingState(boolean useDefault) {
        _defaultEncoding.setSelection(useDefault);
        _otherEncoding.setSelection(!useDefault);
        _fileEncoding.setEnabled(!useDefault);
        updateValidState();
        if (useDefault) {
            String xmlHeaderFormat = Messages.ExportFormatPage_xmlexportformat_xmlheader_text;
            String xmlHeader = NLS.bind(xmlHeaderFormat, new String[] { DEFAULT_ENCODING_STR });
            _xmlHeader.setText(xmlHeader);
        } else {
            String xmlHeaderFormat = Messages.ExportFormatPage_xmlexportformat_xmlheader_text;
            String xmlHeader = NLS.bind(xmlHeaderFormat, new String[] { _fileEncoding.getText() });
            _xmlHeader.setText(xmlHeader);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
    }

    /**
     * initialize values
     */
    private void initializeValues() {
        IPreferenceStore store = getPreferenceStore();
        _addXMLHeader.setSelection(store.getBoolean(PreferenceConstants.EXPORT_FORMAT_ADD_XML_HEADER));
        _xmlHeader.setText(store.getString(PreferenceConstants.EXPORT_FORMAT_XML_HEADER));
        _addXMLRootTag.setSelection(store.getBoolean(PreferenceConstants.EXPORT_FORMAT_ADD_XML_ROOT_TAG));
        _xmlRootTag.setText(store.getString(PreferenceConstants.EXPORT_FORMAT_XML_ROOT_TAG));
        _outputFormat.select(store.getInt(PreferenceConstants.EXPORT_FORMAT_OUTPUT_FORMAT));
        _delimiter.setText(store.getString(PreferenceConstants.EXPORT_FORMAT_DELIMITER));
        _otherEncoding.setSelection(store.getBoolean(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING));
        _fileEncoding.select(store.getInt(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING_SELECTION));
        _defaultEncoding.setSelection(store.getBoolean(PreferenceConstants.EXPORT_FORMAT_DEFAULT_ENCODEING));
        _xmlHeader.setText(store.getString(PreferenceConstants.EXPORT_FORMAT_XML_HEADER));
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
     */
    public boolean performOk() {
        IPreferenceStore store = getPreferenceStore();
        store.setValue(PreferenceConstants.EXPORT_FORMAT_ADD_XML_HEADER, _addXMLHeader.getSelection());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_XML_HEADER, _xmlHeader.getText());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_ADD_XML_ROOT_TAG, _addXMLRootTag.getSelection());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_XML_ROOT_TAG, _xmlRootTag.getText());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_OUTPUT_FORMAT, _outputFormat.getSelectionIndex());
        if (_outputFormat.getText().equals(USER_DEFINED)) {
            store.setValue(PreferenceConstants.EXPORT_FORMAT_DELIMITER, _delimiter.getText());
        }
        store.setValue(PreferenceConstants.EXPORT_FORMAT_DEFAULT_ENCODEING, _defaultEncoding.getSelection());

        store.setValue(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING, _otherEncoding.getSelection());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_OTHER_ENCODEING_SELECTION,
                _fileEncoding.getSelectionIndex());
        store.setValue(PreferenceConstants.EXPORT_FORMAT_PREF_ENCODING, _fileEncoding.getText());
        if (_defaultEncoding.getSelection()) {
            store.setValue(PreferenceConstants.EXPORT_FORMAT_PREF_ENCODING, DEFAULT_ENCODING_STR);
        }

        return super.performOk();
    }

    protected void updateValidState() {
        if (!isEncodingValid()) {
            setErrorMessage(Messages.ExportFormatPage_fileencoding_unsupportedEncoding);
            setValid(false);
        } else {
            setErrorMessage(null);
            setValid(true);
        }
    }

    private boolean isEncodingValid() {
        return _defaultEncoding.getSelection() || isValidEncoding(_fileEncoding.getText());
    }

    private boolean isValidEncoding(String enc) {
        try {
            new String(new byte[0], enc);
            return true;
        } catch (UnsupportedEncodingException e) {
            return false;
        }
    }
}