org.search.niem.uml.papyrus.preferences.ModelPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.search.niem.uml.papyrus.preferences.ModelPreferencePage.java

Source

/*
 * 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:
 *   SEARCH Group, Incorporated - initial API and implementation
 *
 */
package org.search.niem.uml.papyrus.preferences;

import static java.util.Arrays.asList;
import static org.apache.commons.lang.StringUtils.join;
import static org.search.niem.uml.papyrus.preferences.PointOfContact.POINTS_OF_CONTACT_SEPARATOR;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_AUTHORITATIVE_SOURCE_ADDRESS;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_AUTHORITATIVE_SOURCE_NAME;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_AUTHORITATIVE_SOURCE_WEBSITE;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_DEFAULT_MODEL_NAME;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_DOMAINS;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_EXCHANGE_MODEL_TARGET_NAMESPACE;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_EXTENSION_MODEL_TARGET_NAMESPACE;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_KEYWORDS;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_MPD_BASE_URI;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_MPD_DESCRIPTION;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_MPD_PURPOSE;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_MPD_SECURITY_MARKING;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_MPD_VERSION_NUMBER;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.P_POINTS_OF_CONTACT;
import static org.search.niem.uml.papyrus.preferences.PreferenceConstants.SEPARATOR;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.ListEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.search.niem.uml.papyrus.Activator;

public class ModelPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

    public ModelPreferencePage() {
        super(GRID);
        setPreferenceStore(Activator.getPlugin().getPreferenceStore());
        setDescription(Activator.INSTANCE.getString("_UI_ModelPreferencePage_description"));
    }

    @Override
    public void createFieldEditors() {
        addField(new StringFieldEditor(P_DEFAULT_MODEL_NAME,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_defaultModelNamePreference"),
                getFieldEditorParent()));
        addField(new StringFieldEditor(P_EXCHANGE_MODEL_TARGET_NAMESPACE,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_exchangeModelTargetNamespace"),
                getFieldEditorParent()));
        addField(new StringFieldEditor(P_EXTENSION_MODEL_TARGET_NAMESPACE,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_extensionModelTargetNamespace"),
                getFieldEditorParent()));
        addField(new StringFieldEditor(P_MPD_BASE_URI,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_mpdBaseURI"), getFieldEditorParent()));
        addField(new StringFieldEditor(P_MPD_VERSION_NUMBER,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_mpdVersionNumber"), getFieldEditorParent()));
        addField(new StringFieldEditor(P_MPD_DESCRIPTION,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_mpdDescription"), getFieldEditorParent()));
        addField(new StringFieldEditor(P_MPD_PURPOSE,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_mpdPurpose"), getFieldEditorParent()));
        addField(new StringFieldEditor(P_MPD_SECURITY_MARKING,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_mpdSecurityMarking"),
                getFieldEditorParent()));
        addField(new MultiStringEditor(P_DOMAINS, Activator.INSTANCE.getString("_UI_ModelPreferencePage_domain"),
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_domains"), getFieldEditorParent()));
        addField(new MultiStringEditor(P_KEYWORDS, Activator.INSTANCE.getString("_UI_ModelPreferencePage_keyword"),
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_keywords"), getFieldEditorParent()));
        addField(new StringFieldEditor(P_AUTHORITATIVE_SOURCE_NAME,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_authoritativeSourceName"),
                getFieldEditorParent()));
        addField(new MultiLineStringFieldEditor(P_AUTHORITATIVE_SOURCE_ADDRESS,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_authoritativeSourceAddress"),
                getFieldEditorParent()));
        addField(new StringFieldEditor(P_AUTHORITATIVE_SOURCE_WEBSITE,
                Activator.INSTANCE.getString("_UI_ModelPreferencePage_authoritativeSourceWebsite"),
                getFieldEditorParent()));
        addField(new PointsOfContactEditor(getFieldEditorParent()));
    }

    @Override
    public void init(final IWorkbench workbench) {
    }

    private static final class MultiLineStringFieldEditor extends StringFieldEditor {
        private Text textField;
        private int validateStrategy = VALIDATE_ON_KEY_STROKE;
        private int textLimit;

        public MultiLineStringFieldEditor(final String name, final String labelText, final Composite parent) {
            super(name, labelText, parent);
        }

        @Override
        public void setTextLimit(final int limit) {
            super.setTextLimit(limit);
            textLimit = limit;
        }

        @Override
        public void setValidateStrategy(final int value) {
            super.setValidateStrategy(value);
            validateStrategy = value;
        }

        /**
         * Copied directly from {@link StringFieldEditor#getTextControl(Composite)}, except the style is MULTI instead of
         * SINGLE
         */
        @Override
        public Text getTextControl(final Composite parent) {
            if (textField == null) {
                textField = new Text(parent, SWT.MULTI | SWT.BORDER);
                textField.setFont(parent.getFont());
                switch (validateStrategy) {
                case VALIDATE_ON_KEY_STROKE:
                    textField.addKeyListener(new KeyAdapter() {

                        @Override
                        public void keyReleased(final KeyEvent e) {
                            valueChanged();
                        }
                    });
                    textField.addFocusListener(new FocusAdapter() {
                        @Override
                        public void focusLost(final FocusEvent e) {
                            valueChanged();
                        }
                    });

                    break;
                case VALIDATE_ON_FOCUS_LOST:
                    textField.addKeyListener(new KeyAdapter() {
                        @Override
                        public void keyPressed(final KeyEvent e) {
                            clearErrorMessage();
                        }
                    });
                    textField.addFocusListener(new FocusAdapter() {
                        @Override
                        public void focusGained(final FocusEvent e) {
                            refreshValidState();
                        }

                        @Override
                        public void focusLost(final FocusEvent e) {
                            valueChanged();
                            clearErrorMessage();
                        }
                    });
                    break;
                default:
                    Assert.isTrue(false, "Unknown validate strategy");//$NON-NLS-1$
                }
                textField.addDisposeListener(new DisposeListener() {
                    @Override
                    public void widgetDisposed(final DisposeEvent event) {
                        textField = null;
                    }
                });
                if (textLimit > 0) {
                    textField.setTextLimit(textLimit);
                }
            } else {
                checkParent(textField, parent);
            }
            return textField;
        }
    }

    private static final class MultiStringEditor extends ListEditor {

        private final String preferenceName;
        Composite container;

        public MultiStringEditor(final String preferenceCategory, final String preferenceName,
                final String labelText, final Composite parent) {
            this.preferenceName = preferenceName;
            setPreferenceName(preferenceCategory);
            setLabelText(labelText);
            createControl(parent);
        }

        @Override
        protected void createControl(final Composite parent) {
            container = new Composite(parent, SWT.NONE);
            super.createControl(container);
            GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).grab(true, false).applyTo(container);
            GridLayoutFactory.fillDefaults().numColumns(4).applyTo(container);
        }

        @Override
        protected String createList(final String[] items) {
            return join(items, SEPARATOR);
        }

        @Override
        protected String getNewInputObject() {
            final InputDialog userInput = new InputDialog(getShell(),
                    Activator.INSTANCE.getString("_UI_MultiStringEditor_label", new Object[] { preferenceName }),
                    preferenceName, "", null);
            return userInput.open() == Window.OK ? userInput.getValue() : null;
        }

        @Override
        protected String[] parseString(final String stringList) {
            return stringList.split(SEPARATOR);
        }

    }

    private static final class PointsOfContactEditor extends ListEditor {

        public PointsOfContactEditor(final Composite parent) {
            setPreferenceName(P_POINTS_OF_CONTACT);
            setLabelText(Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointsOfContact"));
            createControl(parent);
        }

        @Override
        protected void createControl(final Composite parent) {
            final Composite container = new Composite(parent, SWT.NONE);
            super.createControl(container);
            GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).grab(true, false).applyTo(container);
            GridLayoutFactory.fillDefaults().numColumns(4).applyTo(container);
        }

        @Override
        protected String createList(final String[] items) {
            return join(items, POINTS_OF_CONTACT_SEPARATOR);
        }

        @Override
        protected String getNewInputObject() {
            final InputDialog userInput = new PointOfContactInputDialog(getShell());
            return userInput.open() == Window.OK ? userInput.getValue() : null;
        }

        @Override
        protected String[] parseString(final String stringList) {
            return stringList.split(POINTS_OF_CONTACT_SEPARATOR);
        }

        private static final class PointOfContactInputDialog extends InputDialog {
            private MultiStringEditor emails;
            private MultiStringEditor phoneNumbers;
            private String value;

            public PointOfContactInputDialog(final Shell parentShell) {
                super(parentShell, Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContact"),
                        Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContactName"), "", null);
            }

            @Override
            protected Control createDialogArea(final Composite parent) {
                final Composite theDialogArea = (Composite) super.createDialogArea(parent);
                emails = new MultiStringEditor("FAKE CATEGORY",
                        Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContactEmailAddress"),
                        Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContactEmailAddresses"),
                        theDialogArea);
                phoneNumbers = new MultiStringEditor("FAKE CATEGORY",
                        Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContactPhoneNumber"),
                        Activator.INSTANCE.getString("_UI_ModelPreferencePage_pointOfContactPhoneNumbers"),
                        theDialogArea);
                return theDialogArea;
            }

            @Override
            protected void okPressed() {
                try {
                    value = new PointOfContact(super.getValue(),
                            asList(emails.getListControl(emails.container).getItems()),
                            asList(phoneNumbers.getListControl(phoneNumbers.container).getItems())).toPreference();

                } finally {
                    super.okPressed();
                }
            }

            @Override
            public String getValue() {
                return value;
            }
        }
    }
}