org.eclipse.jst.jsf.ui.internal.validation.OptionsConfigurationBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.jsf.ui.internal.validation.OptionsConfigurationBlock.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
 *******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.validation;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
import org.eclipse.jst.jsf.validation.internal.Severity;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.ui.preferences.IWorkingCopyManager;
import org.eclipse.ui.preferences.WorkingCopyManager;
import org.osgi.service.prefs.BackingStoreException;

/**
 * Abstract options configuration block providing a general implementation for setting up
 * an options configuration page.
 * 
 * @since 2.1
 */
abstract class OptionsConfigurationBlock {
    /**
     * The preference model to be used
     */
    protected final IJSFPreferenceModel _prefs;

    static final class Key {
        private String fQualifier;
        private String fKey;

        Key(String qualifier, String key) {
            fQualifier = qualifier;
            fKey = key;
        }

        /**
         * @return the key name
         */
        public String getName() {
            return fKey;
        }

        //        private IEclipsePreferences getNode(IScopeContext context, IWorkingCopyManager manager) {
        //            IEclipsePreferences node= context.getNode(fQualifier);
        //            if (manager != null) {
        //                return manager.getWorkingCopy(node);
        //            }
        //            return node;
        //            
        //        }

        /**
         * @param prefModel
         * @param context
         * @param manager
         * @return the value stored for the key
         */
        public Object getStoredValue(IJSFPreferenceModel prefModel, IScopeContext context,
                IWorkingCopyManager manager) {
            return prefModel.getStoredValueByKey(context, fKey);
        }

        /**
         * @param prefModel
         * @param context
         * @param manager
         * @return the stored value in prefModel under context for
         * this key
         */
        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext context,
                IWorkingCopyManager manager) {
            //return getNode(context, manager).get(fKey, null);
            return prefModel.getValueByKey(context, fKey);
        }

        /**
         * @param prefModel
         * @param lookupOrder
         * @param ignoreTopScope
         * @param manager
         * @return the stored value in the prefModelunder context
         * using the list of lookupOrder for precedence of scopes
         * in which to look.  Return first found based on order in lookupOrder
         */
        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext[] lookupOrder,
                boolean ignoreTopScope, IWorkingCopyManager manager) {
            for (int i = ignoreTopScope ? 1 : 0; i < lookupOrder.length; i++) {
                Object value = getCurValue(prefModel, lookupOrder[i], manager);
                if (value != null) {
                    return value;
                }
            }
            return null;
        }

        /**
         * Set the stored value
         * @param prefModel 
         * @param context
         * @param value
         * @param manager
         * @return the old value or null if none
         */
        public Object setCurValue(IJSFPreferenceModel prefModel, IScopeContext context, Object value,
                IWorkingCopyManager manager) {
            return prefModel.setValueByKey(context, fKey, value);
            //            if (value != null) {
            //                getNode(context, manager).put(fKey, value);
            //            } else {
            //                getNode(context, manager).remove(fKey);
            //            }
        }

        /* (non-Javadoc)
         * @see java.lang.Object#toString()
         */
        public String toString() {
            return fQualifier + '/' + fKey;
        }

        /**
         * @return the plugin qualifier
         */
        public String getQualifier() {
            return fQualifier;
        }

    }

    static class ControlData {
        private Key fKey;
        private String[] fValues;

        ControlData(Key key, String[] values) {
            fKey = key;
            fValues = values;
        }

        Key getKey() {
            return fKey;
        }

        String getValue(boolean selection) {
            int index = selection ? 0 : 1;
            return fValues[index];
        }

        String getValue(int index) {
            return fValues[index];
        }

        int getSelection(String value) {
            if (value != null) {
                for (int i = 0; i < fValues.length; i++) {
                    if (value.equals(fValues[i])) {
                        return i;
                    }
                }
            }
            return fValues.length - 1; // assume the last option is the least severe
        }
    }

    private static final String REBUILD_COUNT_KEY = "preferences_build_requested"; //$NON-NLS-1$

    private static final String SETTINGS_EXPANDED = "expanded"; //$NON-NLS-1$

    private final ArrayList fCheckBoxes;
    private final ArrayList fComboBoxes;
    private final ArrayList fTextBoxes;
    private final HashMap fLabels;
    private final ArrayList fExpandedComposites;

    private SelectionListener fSelectionListener;
    private ModifyListener fTextModifyListener;

    // TODO: protected IStatusChangeListener fContext;
    private final IProject fProject; // project or null
    private final Key[] fAllKeys;

    private IScopeContext[] fLookupOrder;

    private Shell fShell;

    private final IWorkingCopyManager fManager;
    private IWorkbenchPreferenceContainer fContainer;

    private Map fDisabledProjectSettings; // null when project specific settings are turned off

    private int fRebuildCount; /// used to prevent multiple dialogs that ask for a rebuild

    OptionsConfigurationBlock(/*IStatusChangeListener context,*/IJSFPreferenceModel prefs, IProject project,
            Key[] allKeys, IWorkbenchPreferenceContainer container) {
        //fContext= context;
        fProject = project;
        fAllKeys = allKeys;
        fContainer = container;
        _prefs = prefs;

        if (container == null) {
            fManager = new WorkingCopyManager();
        } else {
            fManager = container.getWorkingCopyManager();
        }

        if (fProject != null) {
            fLookupOrder = new IScopeContext[] { new ProjectScope(fProject), new InstanceScope(),
                    new DefaultScope() };
        } else {
            fLookupOrder = new IScopeContext[] { new InstanceScope(), new DefaultScope() };
        }

        testIfOptionsComplete(allKeys);
        if (fProject == null || hasProjectSpecificOptions(fProject)) {
            fDisabledProjectSettings = null;
        } else {
            fDisabledProjectSettings = new IdentityHashMap();
            for (int i = 0; i < allKeys.length; i++) {
                Key curr = allKeys[i];
                fDisabledProjectSettings.put(curr, curr.getCurValue(_prefs, fLookupOrder, false, fManager));
            }
        }

        fCheckBoxes = new ArrayList();
        fComboBoxes = new ArrayList();
        fTextBoxes = new ArrayList(2);
        fLabels = new HashMap();
        fExpandedComposites = new ArrayList();

        fRebuildCount = getRebuildCount();
    }

    /**
     * @return the preference container
     */
    protected final IWorkbenchPreferenceContainer getPreferenceContainer() {
        return fContainer;
    }

    /**
     * @param plugin
     * @param key
     * @return construct a new Key based on the on the plugin id and
     * preference key
     */
    protected static Key getKey(String plugin, String key) {
        return new Key(plugin, key);
    }

    /**
     * @param key
     * @return construct a new Key for a JSF core plugin preference
     */
    protected final static Key getJSFCoreKey(String key) {
        return getKey(JSFCorePlugin.PLUGIN_ID, key);
    }

    private void testIfOptionsComplete(Key[] allKeys) {
        for (int i = 0; i < allKeys.length; i++) {
            if (allKeys[i].getCurValue(_prefs, fLookupOrder, false, fManager) == null) {
                JSFUiPlugin.log(IStatus.ERROR,
                        "preference option missing: " + allKeys[i] + " (" + this.getClass().getName() + ')'); //$NON-NLS-1$//$NON-NLS-2$
            }
        }
    }

    private int getRebuildCount() {
        return fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).getInt(REBUILD_COUNT_KEY, 0);
    }

    private void incrementRebuildCount() {
        fRebuildCount++;
        fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).putInt(REBUILD_COUNT_KEY,
                fRebuildCount);
    }

    //    public void selectOption(String key, String qualifier) {
    //        for (int i= 0; i < fAllKeys.length; i++) {
    //            Key curr= fAllKeys[i];
    //            if (curr.getName().equals(key) && curr.getQualifier().equals(qualifier)) {
    //                selectOption(curr);
    //            }
    //        }
    //    }
    //    
    //    public void selectOption(Key key) {
    //        Control control= findControl(key);
    //        if (control != null) {
    //            if (!fExpandedComposites.isEmpty()) {
    //                ExpandableComposite expandable= getParentExpandableComposite(control);
    //                if (expandable != null) {
    //                    for (int i= 0; i < fExpandedComposites.size(); i++) {
    //                        ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
    //                        curr.setExpanded(curr == expandable);
    //                    }
    //                    expandedStateChanged(expandable);
    //                }
    //            }
    //            control.setFocus();
    //        }
    //    }

    /**
     * @param project
     * @return true if there are project specific overrides in the 
     * preferences for 'project'
     */
    public final boolean hasProjectSpecificOptions(IProject project) {
        if (project != null) {
            IScopeContext projectContext = new ProjectScope(project);
            Key[] allKeys = fAllKeys;
            for (int i = 0; i < allKeys.length; i++) {
                if (allKeys[i].getCurValue(_prefs, projectContext, fManager) != null) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @return the shell hosting the UI
     */
    protected Shell getShell() {
        return fShell;
    }

    /**
     * Set the shell hosting the UI.
     * @param shell
     */
    protected void setShell(Shell shell) {
        fShell = shell;
    }

    /**
     * @param parent
     * @return the parent of the UI control to be created
     */
    protected abstract Control createContents(Composite parent);

    //    protected Button addCheckBox(Composite parent, String label, Key key, String[] values, int indent) {
    //        ControlData data= new ControlData(key, values);
    //        
    //        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
    //        gd.horizontalSpan= 3;
    //        gd.horizontalIndent= indent;
    //        
    //        Button checkBox= new Button(parent, SWT.CHECK);
    //        checkBox.setFont(JFaceResources.getDialogFont());
    //        checkBox.setText(label);
    //        checkBox.setData(data);
    //        checkBox.setLayoutData(gd);
    //        checkBox.addSelectionListener(getSelectionListener());
    //        
    //        makeScrollableCompositeAware(checkBox);
    //        
    //        String currValue= getValue(key);
    //        checkBox.setSelection(data.getSelection(currValue) == 0);
    //        
    //        fCheckBoxes.add(checkBox);
    //        
    //        return checkBox;
    //    }

    /**
     * @param parent
     * @param label
     * @param key
     * @param values
     * @param indent
     * @param widthHint
     * @param listener
     * @return a check box styled button with a related link
     */
    protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values, int indent,
            int widthHint, SelectionListener listener) {
        ControlData data = new ControlData(key, values);

        GridData gd = new GridData(GridData.FILL, GridData.FILL, true, false);
        gd.horizontalSpan = 3;
        gd.horizontalIndent = indent;

        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 2;
        composite.setLayout(layout);
        composite.setLayoutData(gd);

        Button checkBox = new Button(composite, SWT.CHECK);
        checkBox.setFont(JFaceResources.getDialogFont());
        checkBox.setData(data);
        checkBox.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
        checkBox.addSelectionListener(getSelectionListener());

        gd = new GridData(GridData.FILL, GridData.CENTER, true, false);
        gd.widthHint = widthHint;

        Link link = new Link(composite, SWT.NONE);
        link.setText(label);
        link.setLayoutData(gd);
        if (listener != null) {
            link.addSelectionListener(listener);
        }

        makeScrollableCompositeAware(link);
        makeScrollableCompositeAware(checkBox);

        String currValue = getValue(key);
        checkBox.setSelection(data.getSelection(currValue) == 0);

        fCheckBoxes.add(checkBox);

        return checkBox;
    }

    /**
     * @param parent
     * @param label
     * @param key
     * @param values
     * @param valueLabels
     * @param indent
     * @return a Combo box added to parent with the label and key
     */
    protected Combo addComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels,
            int indent) {
        GridData gd = new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
        gd.horizontalIndent = indent;

        Label labelControl = new Label(parent, SWT.LEFT);
        labelControl.setFont(JFaceResources.getDialogFont());

        labelControl.setText(label);
        labelControl.setLayoutData(gd);

        Combo comboBox = newComboControl(parent, key, values, valueLabels);
        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));

        fLabels.put(comboBox, labelControl);

        return comboBox;
    }

    Combo addInversedComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels,
            int indent) {
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
        gd.horizontalIndent = indent;
        gd.horizontalSpan = 3;

        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 2;
        composite.setLayout(layout);
        composite.setLayoutData(gd);

        Combo comboBox = newComboControl(composite, key, values, valueLabels);
        comboBox.setFont(JFaceResources.getDialogFont());
        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));

        Label labelControl = new Label(composite, SWT.LEFT | SWT.WRAP);
        labelControl.setText(label);
        labelControl.setLayoutData(new GridData());

        fLabels.put(comboBox, labelControl);
        return comboBox;
    }

    Combo newComboControl(Composite composite, Key key, String[] values, String[] valueLabels) {
        ControlData data = new ControlData(key, values);

        Combo comboBox = new Combo(composite, SWT.READ_ONLY);
        comboBox.setItems(valueLabels);
        comboBox.setData(data);
        comboBox.addSelectionListener(getSelectionListener());
        comboBox.setFont(JFaceResources.getDialogFont());

        makeScrollableCompositeAware(comboBox);

        String currValue = getValue(key);
        comboBox.select(data.getSelection(currValue));

        fComboBoxes.add(comboBox);
        return comboBox;
    }

    Text addTextField(Composite parent, String label, Key key, int indent, int widthHint) {
        Label labelControl = new Label(parent, SWT.WRAP);
        labelControl.setText(label);
        labelControl.setFont(JFaceResources.getDialogFont());
        labelControl.setLayoutData(new GridData());

        Text textBox = new Text(parent, SWT.BORDER | SWT.SINGLE);
        textBox.setData(key);
        textBox.setLayoutData(new GridData());

        makeScrollableCompositeAware(textBox);

        fLabels.put(textBox, labelControl);

        String currValue = getValue(key);
        if (currValue != null) {
            textBox.setText(currValue);
        }
        textBox.addModifyListener(getTextModifyListener());

        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        if (widthHint != 0) {
            data.widthHint = widthHint;
        }
        data.horizontalIndent = indent;
        data.horizontalSpan = 2;
        textBox.setLayoutData(data);

        fTextBoxes.add(textBox);
        return textBox;
    }

    ScrolledPageContent getParentScrolledComposite(Control control) {
        Control parent = control.getParent();
        while (!(parent instanceof ScrolledPageContent) && parent != null) {
            parent = parent.getParent();
        }
        if (parent instanceof ScrolledPageContent) {
            return (ScrolledPageContent) parent;
        }
        return null;
    }

    ExpandableComposite getParentExpandableComposite(Control control) {
        Control parent = control.getParent();
        while (!(parent instanceof ExpandableComposite) && parent != null) {
            parent = parent.getParent();
        }
        if (parent instanceof ExpandableComposite) {
            return (ExpandableComposite) parent;
        }
        return null;
    }

    private void makeScrollableCompositeAware(Control control) {
        ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(control);
        if (parentScrolledComposite != null) {
            parentScrolledComposite.adaptChild(control);
        }
    }

    ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
        ExpandableComposite excomposite = new ExpandableComposite(parent, SWT.NONE,
                ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
        excomposite.setText(label);
        excomposite.setExpanded(false);
        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
        excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
        excomposite.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                expandedStateChanged((ExpandableComposite) e.getSource());
            }
        });
        fExpandedComposites.add(excomposite);
        makeScrollableCompositeAware(excomposite);
        return excomposite;
    }

    final void expandedStateChanged(ExpandableComposite expandable) {
        ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(expandable);
        if (parentScrolledComposite != null) {
            parentScrolledComposite.reflow(true);
        }
    }

    void restoreSectionExpansionStates(IDialogSettings settings) {
        for (int i = 0; i < fExpandedComposites.size(); i++) {
            ExpandableComposite excomposite = (ExpandableComposite) fExpandedComposites.get(i);
            if (settings == null) {
                excomposite.setExpanded(i == 0); // only expand the first node by default
            } else {
                excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
            }
        }
    }

    void storeSectionExpansionStates(IDialogSettings settings) {
        for (int i = 0; i < fExpandedComposites.size(); i++) {
            ExpandableComposite curr = (ExpandableComposite) fExpandedComposites.get(i);
            settings.put(SETTINGS_EXPANDED + String.valueOf(i), curr.isExpanded());
        }
    }

    SelectionListener getSelectionListener() {
        if (fSelectionListener == null) {
            fSelectionListener = new SelectionListener() {
                public void widgetDefaultSelected(SelectionEvent e) {
                    /*do nothing*/}

                public void widgetSelected(SelectionEvent e) {
                    controlChanged(e.widget);
                }
            };
        }
        return fSelectionListener;
    }

    ModifyListener getTextModifyListener() {
        if (fTextModifyListener == null) {
            fTextModifyListener = new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    textChanged((Text) e.widget);
                }
            };
        }
        return fTextModifyListener;
    }

    void controlChanged(Widget widget) {
        ControlData data = (ControlData) widget.getData();
        String newValue = null;
        if (widget instanceof Button) {
            newValue = data.getValue(((Button) widget).getSelection());
        } else if (widget instanceof Combo) {
            newValue = data.getValue(((Combo) widget).getSelectionIndex());
        } else {
            return;
        }
        String oldValue = setValue(data.getKey(), newValue);
        validateSettings(data.getKey(), oldValue, newValue);
    }

    void textChanged(Text textControl) {
        Key key = (Key) textControl.getData();
        String number = textControl.getText();
        String oldValue = setValue(key, number);
        validateSettings(key, oldValue, number);
    }

    boolean checkValue(Key key, String value) {
        return value.equals(getValue(key));
    }

    String getValue(Key key) {
        if (fDisabledProjectSettings != null) {
            return (String) fDisabledProjectSettings.get(key);
        }
        return key.getCurValue(_prefs, fLookupOrder, false, fManager).toString();
    }

    boolean getBooleanValue(Key key) {
        return Boolean.valueOf(getValue(key)).booleanValue();
    }

    String setValue(Key key, String value) {
        if (fDisabledProjectSettings != null) {
            return (String) fDisabledProjectSettings.put(key, value);
        }
        Object newValue = key.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(value), fManager);
        return newValue != null ? newValue.toString() : ""; //$NON-NLS-1$
    }

    String setValue(Key key, boolean value) {
        return setValue(key, String.valueOf(value));
    }

    /**
     * Returns the value as actually stored in the preference store.
     * @param key
     * @return the value as actually stored in the preference store.
     */
    Object getStoredValue(Key key) {
        return key.getCurValue(_prefs, fLookupOrder, false, fManager);
    }

    /**
     * Update fields and validate.
     * @param changedKey Key that changed, or null, if all changed.
     * @param oldValue 
     * @param newValue 
     */
    protected abstract void validateSettings(Key changedKey, String oldValue, String newValue);

    String[] getTokens(String text, String separator) {
        StringTokenizer tok = new StringTokenizer(text, separator);
        int nTokens = tok.countTokens();
        String[] res = new String[nTokens];
        for (int i = 0; i < res.length; i++) {
            res[i] = tok.nextToken().trim();
        }
        return res;
    }

    private boolean getChanges(IScopeContext currContext, List changedSettings) {
        boolean needsBuild = false;
        for (int i = 0; i < fAllKeys.length; i++) {
            Key key = fAllKeys[i];
            Object oldVal = key.getStoredValue(_prefs, currContext, null);
            Object val = key.getCurValue(_prefs, currContext, fManager);
            if (val == null) {
                if (oldVal != null) {
                    changedSettings.add(key);
                    needsBuild |= !oldVal.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
                }
            } else if (!val.equals(oldVal)) {
                changedSettings.add(key);
                needsBuild |= oldVal != null || !val.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
            }
        }
        return needsBuild;
    }

    void useProjectSpecificSettings(boolean enable) {
        boolean hasProjectSpecificOption = fDisabledProjectSettings == null;
        if (enable != hasProjectSpecificOption && fProject != null) {
            if (enable) {
                for (int i = 0; i < fAllKeys.length; i++) {
                    Key curr = fAllKeys[i];
                    String val = (String) fDisabledProjectSettings.get(curr);
                    curr.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(val), fManager);
                }
                fDisabledProjectSettings = null;
                updateControls();
                validateSettings(null, null, null);
            } else {
                fDisabledProjectSettings = new IdentityHashMap();
                for (int i = 0; i < fAllKeys.length; i++) {
                    Key curr = fAllKeys[i];
                    Object oldSetting = curr.getCurValue(_prefs, fLookupOrder, false, fManager);
                    fDisabledProjectSettings.put(curr, oldSetting);
                    curr.setCurValue(_prefs, fLookupOrder[0], null, fManager); // clear project settings
                }
            }
        }
    }

    boolean areSettingsEnabled() {
        return fDisabledProjectSettings == null || fProject == null;
    }

    boolean performOk() {
        return processChanges(fContainer);
    }

    //    public boolean performApply() {
    //        return processChanges(null); // apply directly
    //    }

    boolean processChanges(IWorkbenchPreferenceContainer container) {
        IScopeContext currContext = fLookupOrder[0];

        List /* <Key>*/ changedOptions = new ArrayList();
        boolean needsBuild = getChanges(currContext, changedOptions);
        if (changedOptions.isEmpty()) {
            return true;
        }
        if (needsBuild) {
            int count = getRebuildCount();
            if (count > fRebuildCount) {
                needsBuild = false; // build already requested
                fRebuildCount = count;
            }
        }

        boolean doBuild = false;

        final String showBuildWarningKey = JSFCorePlugin.PLUGIN_ID + "." + "buildwarning_dont_show_again"; //$NON-NLS-1$ //$NON-NLS-2$
        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
        final boolean showDialog = !MessageDialogWithToggle.ALWAYS.equals(prefStore.getString(showBuildWarningKey));

        if (needsBuild && showDialog) {
            String[] strings = getFullBuildDialogStrings(fProject == null);
            if (strings != null) {
                MessageDialogWithToggle.openInformation(getShell(), strings[0], strings[1],
                        PreferencesMessages.ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again, false,
                        prefStore, showBuildWarningKey);
                //                int res= dialog.open();
                //                if (res == 0) {
                //                    doBuild= true;
                //                } else if (res != 1) {
                //                    return false; // cancel pressed
                //                }
            }
        }
        if (container != null) {
            // no need to apply the changes to the original store: will be done by the page container
            if (doBuild) { // post build
                incrementRebuildCount();
                // TODO: container.registerUpdateJob(CoreUtility.getBuildJob(fProject));
            }
        } else {
            // apply changes right away
            try {
                fManager.applyChanges();
            } catch (BackingStoreException e) {
                JSFUiPlugin.log(IStatus.ERROR, "Error applying changes", e); //$NON-NLS-1$
                return false;
            }
            if (doBuild) {
                //CoreUtility.getBuildJob(fProject).schedule();
            }

        }
        return true;
    }

    abstract String[] getFullBuildDialogStrings(boolean workspaceSettings);

    //    public void performDefaults() {
    //        for (int i= 0; i < fAllKeys.length; i++) {
    //            Key curr= fAllKeys[i];
    //            String defValue= curr.getStoredValue(fLookupOrder, true, fManager);
    //            setValue(curr, defValue);
    //        }
    //        
    //        settingsUpdated();
    //        updateControls();
    //        validateSettings(null, null, null);
    //    }

    /**
     * @since 3.1
     */
    void performRevert() {
        for (int i = 0; i < fAllKeys.length; i++) {
            Key curr = fAllKeys[i];
            String origValue = curr.getCurValue(_prefs, fLookupOrder, false, null).toString();
            setValue(curr, origValue);
        }

        updateControls();
        validateSettings(null, null, null);
    }

    void dispose() {
        // do nothing; sub-class should override
    }

    void updateControls() {
        // update the UI
        for (int i = fCheckBoxes.size() - 1; i >= 0; i--) {
            updateCheckBox((Button) fCheckBoxes.get(i));
        }
        for (int i = fComboBoxes.size() - 1; i >= 0; i--) {
            updateCombo((Combo) fComboBoxes.get(i));
        }
        for (int i = fTextBoxes.size() - 1; i >= 0; i--) {
            updateText((Text) fTextBoxes.get(i));
        }
    }

    void updateCombo(Combo curr) {
        ControlData data = (ControlData) curr.getData();

        String currValue = getValue(data.getKey());
        curr.select(data.getSelection(currValue));
    }

    void updateCheckBox(Button curr) {
        ControlData data = (ControlData) curr.getData();

        String currValue = getValue(data.getKey());
        curr.setSelection(data.getSelection(currValue) == 0);
    }

    void updateText(Text curr) {
        Key key = (Key) curr.getData();

        String currValue = getValue(key);
        if (currValue != null) {
            curr.setText(currValue);
        }
    }

    Button getCheckBox(Key key) {
        for (int i = fCheckBoxes.size() - 1; i >= 0; i--) {
            Button curr = (Button) fCheckBoxes.get(i);
            ControlData data = (ControlData) curr.getData();
            if (key.equals(data.getKey())) {
                return curr;
            }
        }
        return null;
    }

    Combo getComboBox(Key key) {
        for (int i = fComboBoxes.size() - 1; i >= 0; i--) {
            Combo curr = (Combo) fComboBoxes.get(i);
            ControlData data = (ControlData) curr.getData();
            if (key.equals(data.getKey())) {
                return curr;
            }
        }
        return null;
    }

    Text getTextControl(Key key) {
        for (int i = fTextBoxes.size() - 1; i >= 0; i--) {
            Text curr = (Text) fTextBoxes.get(i);
            ControlData data = (ControlData) curr.getData();
            if (key.equals(data.getKey())) {
                return curr;
            }
        }
        return null;
    }

    Control findControl(Key key) {
        Combo comboBox = getComboBox(key);
        if (comboBox != null) {
            return comboBox;
        }
        Button checkBox = getCheckBox(key);
        if (checkBox != null) {
            return checkBox;
        }
        Text text = getTextControl(key);
        if (text != null) {
            return text;
        }
        return null;
    }

    void setComboEnabled(Key key, boolean enabled) {
        Combo combo = getComboBox(key);
        Label label = (Label) fLabels.get(combo);
        combo.setEnabled(enabled);
        label.setEnabled(enabled);
    }
}