uk.ac.diamond.scisoft.qstatmonitor.preferences.QStatMonitorPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.diamond.scisoft.qstatmonitor.preferences.QStatMonitorPreferencePage.java

Source

/*
 * Copyright (c) 2012 Diamond Light Source Ltd.
 *
 * 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
 */
package uk.ac.diamond.scisoft.qstatmonitor.preferences;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import uk.ac.diamond.scisoft.qstatmonitor.Activator;

public class QStatMonitorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    public static final String ID = "uk.ac.diamond.scisoft.qstatmonitor.preferences.QStatMonitorPreferencePage";
    private static final Logger logger = LoggerFactory.getLogger(QStatMonitorPreferencePage.class);

    private static final int SPN_DEC_PLACES = 1;
    // Must not exceed SPN_DEC_PLACES number of decimal places
    private static final float REF_INC_VAL = 0.5f;
    private static final float REF_MIN_VAL = 2.0f;
    private static final float REF_MAX_VAL = 100.0f;

    // List of items for resource combo
    private static final String[] RESOURCE_LIST = new String[] { "tesla", "tesla64" };

    /**
     * Converts refresh interval value to spinner compatible value (integer)
     * 
     * @param 
     *       value
     * @return
     *       spinner value
     */
    private static int convertSpinnerValue(float value) {
        int multFactor = (int) Math.pow(10, SPN_DEC_PLACES);
        return (int) (value * multFactor);
    }

    // Widgets
    private Button btnAutoRefresh;
    private Button btnAllResources;
    private Button btnUsersAll;
    private Button btnUsersCurr;
    private Button btnUsersCust;
    private Spinner spnInterval;
    private Combo cboResource;
    private Text txtUser;

    // Validation checks
    // Required to determine overall state
    private boolean validResource = true;
    private boolean validUser = true;

    public QStatMonitorPreferencePage() {
    }

    @Override
    public void init(IWorkbench workbench) {
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
    }

    @Override
    protected Control createContents(Composite parent) {
        final IPreferenceStore preferences = Activator.getDefault().getPreferenceStore();

        Composite mainComposite = new Composite(parent, SWT.NONE);
        mainComposite.setLayout(new GridLayout(1, false));
        mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        setupRefreshPart(mainComposite, preferences);

        // Empty label to create gap between Refresh and Query parts
        new Label(mainComposite, SWT.NONE);

        setupQueryPart(mainComposite, preferences);

        initialiseWidgets(preferences);

        return mainComposite;
    }

    /**
     * Sets up widgets for refresh settings
     * 
     * @param parent
     * @param preferences
     */
    private void setupRefreshPart(Composite parent, final IPreferenceStore preferences) {
        // Place all widgets inside Group
        Group grpRefresh = new Group(parent, SWT.NONE);
        grpRefresh.setText("Refresh Settings");
        grpRefresh.setLayout(new GridLayout(2, false));
        grpRefresh.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        (new Label(grpRefresh, SWT.NONE)).setText("Enable automatic refreshing");
        btnAutoRefresh = new Button(grpRefresh, SWT.CHECK | SWT.NO_FOCUS);
        btnAutoRefresh.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                // Enables/disables interval spinner
                spnInterval.setEnabled(!spnInterval.getEnabled());
                //spnInterval.setSelection(convertSpinnerValue(preferences.getFloat(QStatMonitorPreferenceConstants.P_SLEEP)));
            }
        });

        (new Label(grpRefresh, SWT.NONE)).setText("Interval (seconds)");
        spnInterval = new Spinner(grpRefresh, SWT.READ_ONLY | SWT.BORDER);
        spnInterval.setDigits(SPN_DEC_PLACES);
        spnInterval.setIncrement(convertSpinnerValue(REF_INC_VAL));
        spnInterval.setMinimum(convertSpinnerValue(REF_MIN_VAL));
        spnInterval.setMaximum(convertSpinnerValue(REF_MAX_VAL));
    }

    /**
     * Sets up widgets for query configuration
     * 
     * @param parent
     * @param preferences
     */
    private void setupQueryPart(Composite parent, final IPreferenceStore preferences) {
        (new Label(parent, SWT.NONE)).setText("Query Configuration");
        setupResourcesSubPart(parent, preferences);
        setupUsersSubPart(parent, preferences);
    }

    /**
     * Sets up widgets for resource part of query configuration
     * 
     * @param parent
     * @param preferences
     */
    private void setupResourcesSubPart(Composite parent, final IPreferenceStore preferences) {
        // Put widgets inside group
        Group grpResources = new Group(parent, SWT.NONE);
        grpResources.setText("Resources");
        grpResources.setLayout(new GridLayout(2, false));
        grpResources.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        (new Label(grpResources, SWT.NONE)).setText("Show all resources");
        btnAllResources = new Button(grpResources, SWT.CHECK | SWT.NO_FOCUS);
        btnAllResources.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                // Enable/disable combobox
                cboResource.setEnabled(!cboResource.getEnabled());

                // All resources checkbox selected
                if (btnAllResources.getSelection()) {
                    validResource = true;
                    setValidState();
                } else {
                    validateResourceText();
                }
            }
        });

        (new Label(grpResources, SWT.NONE)).setText("Custom resource");
        cboResource = new Combo(grpResources, SWT.DROP_DOWN);
        cboResource.setItems(RESOURCE_LIST);
        cboResource.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                if (!btnAllResources.getSelection()) {
                    validateResourceText();
                }
            }
        });
    }

    /**
     * Sets up widgets for user part of query configuration
     * 
     * @param parent
     * @param preferences
     */
    private void setupUsersSubPart(Composite parent, final IPreferenceStore preferences) {
        // Put widgets inside group
        Group grpUsers = new Group(parent, SWT.NONE);
        grpUsers.setText("Users");
        grpUsers.setLayout(new GridLayout(2, false));
        grpUsers.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        // Set up radio buttons
        btnUsersAll = new Button(grpUsers, SWT.RADIO);
        btnUsersAll.setText("All");
        btnUsersAll.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                txtUser.setEnabled(false);
                validUser = true;
                setValidState();
            }
        });
        new Label(grpUsers, SWT.NONE); // Empty label to fill 2nd cell

        btnUsersCurr = new Button(grpUsers, SWT.RADIO);
        btnUsersCurr.setText("Current");
        btnUsersCurr.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                txtUser.setEnabled(false);
                validUser = true;
                setValidState();
            }
        });
        new Label(grpUsers, SWT.NONE); // Empty label to fill 2nd cell

        btnUsersCust = new Button(grpUsers, SWT.RADIO);
        btnUsersCust.setText("Custom");
        btnUsersCust.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                txtUser.setEnabled(true);
                validateUserText();
            }
        });

        // Custom user text box
        txtUser = new Text(grpUsers, SWT.BORDER);
        txtUser.setLayoutData(new GridData(80, SWT.DEFAULT));
        txtUser.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                if (btnUsersCust.getSelection()) {
                    validateUserText();
                }
            }
        });
    }

    /**
     * Attempt to make state valid
     */
    private void setValidState() {
        setErrorMessage(null);

        // Both must be true
        if (validResource && validUser) {
            setValid(true);
        }

        showErrorMessage();
    }

    /**
     * Reprint error message if still invalid
     */
    private void showErrorMessage() {
        if (!validResource) {
            setErrorMessage("Resource name cannot be blank");
        }

        if (!validUser) {
            setErrorMessage("Username cannot be blank");
        }
    }

    /**
     * Validates resource text value
     */
    private void validateResourceText() {
        // Text value not empty
        if (!cboResource.getText().equals("")) {
            validResource = true;
            setValidState();
        } else {
            validResource = false;
            setErrorMessage("Resource name cannot be blank");
            setValid(false);
        }
    }

    /**
     * Validates user text value
     */
    private void validateUserText() {
        // Text value not empty
        if (!txtUser.getText().equals("")) {
            validUser = true;
            setValidState();
        } else {
            validUser = false;
            setErrorMessage("Username cannot be blank");
            setValid(false);
        }
    }

    /**
     * Initialises widgets start-up configuration
     * 
     * @param preferences
     */
    private void initialiseWidgets(final IPreferenceStore preferences) {
        setWidgetValues(preferences);
        disableWidgets();
    }

    /**
     * Initialises widgets start-up values
     * 
     * @param preferences
     */
    private void setWidgetValues(final IPreferenceStore preferences) {
        btnAutoRefresh.setSelection(preferences.getBoolean(QStatMonitorPreferenceConstants.P_REFRESH));
        spnInterval
                .setSelection(convertSpinnerValue(preferences.getFloat(QStatMonitorPreferenceConstants.P_SLEEP)));

        btnAllResources.setSelection(preferences.getBoolean(QStatMonitorPreferenceConstants.P_RESOURCES_ALL));
        cboResource.setText(preferences.getString(QStatMonitorPreferenceConstants.P_RESOURCE));

        btnUsersAll.setSelection(preferences.getBoolean(QStatMonitorPreferenceConstants.P_USER_ALL));
        btnUsersCurr.setSelection(preferences.getBoolean(QStatMonitorPreferenceConstants.P_USER_CURR));
        btnUsersCust.setSelection(preferences.getBoolean(QStatMonitorPreferenceConstants.P_USER_CUST));
        txtUser.setText(preferences.getString(QStatMonitorPreferenceConstants.P_USER));
    }

    /**
     * Disables widgets depending on button selection
     */
    private void disableWidgets() {
        if (!btnAutoRefresh.getSelection()) {
            spnInterval.setEnabled(false);
        }
        if (btnAllResources.getSelection()) {
            cboResource.setEnabled(false);
        }
        if (btnUsersAll.getSelection() | btnUsersCurr.getSelection()) {
            txtUser.setEnabled(false);
        }
    }

    @Override
    public boolean performOk() {
        IPreferenceStore preferences = Activator.getDefault().getPreferenceStore();

        preferences.setValue(QStatMonitorPreferenceConstants.P_REFRESH, btnAutoRefresh.getSelection());
        if (btnAutoRefresh.getSelection()) {
            preferences.setValue(QStatMonitorPreferenceConstants.P_SLEEP, Float.parseFloat(spnInterval.getText()));
        }

        preferences.setValue(QStatMonitorPreferenceConstants.P_RESOURCES_ALL, btnAllResources.getSelection());
        if (!btnAllResources.getSelection()) {
            preferences.setValue(QStatMonitorPreferenceConstants.P_RESOURCE, cboResource.getText());
        } else {
            preferences.setValue(QStatMonitorPreferenceConstants.P_RESOURCE, "");
        }

        preferences.setValue(QStatMonitorPreferenceConstants.P_USER_ALL, btnUsersAll.getSelection());
        preferences.setValue(QStatMonitorPreferenceConstants.P_USER_CURR, btnUsersCurr.getSelection());
        preferences.setValue(QStatMonitorPreferenceConstants.P_USER_CUST, btnUsersCust.getSelection());
        if (btnUsersCust.getSelection()) {
            preferences.setValue(QStatMonitorPreferenceConstants.P_USER, txtUser.getText());
        } else {
            preferences.setValue(QStatMonitorPreferenceConstants.P_USER, "");
        }

        return super.performOk();
    }

    @Override
    protected void performDefaults() {
        IPreferenceStore preferences = Activator.getDefault().getPreferenceStore();
        setWidgetsDefaultValues(preferences);
        disableWidgets();
        resetState();
    }

    /**
     * Sets page state to valid after reset to default preference values
     */
    private void resetState() {
        validResource = true;
        validUser = true;
        setErrorMessage(null);
        setValid(true);
    }

    /**
     * Initialises widgets to default values
     * 
     * @param preferences
     */
    private void setWidgetsDefaultValues(final IPreferenceStore preferences) {
        btnAutoRefresh.setSelection(preferences.getDefaultBoolean(QStatMonitorPreferenceConstants.P_REFRESH));
        spnInterval.setSelection(
                convertSpinnerValue(preferences.getDefaultFloat(QStatMonitorPreferenceConstants.P_SLEEP)));

        btnAllResources
                .setSelection(preferences.getDefaultBoolean(QStatMonitorPreferenceConstants.P_RESOURCES_ALL));
        cboResource.setText(preferences.getDefaultString(QStatMonitorPreferenceConstants.P_RESOURCE));

        btnUsersAll.setSelection(preferences.getDefaultBoolean(QStatMonitorPreferenceConstants.P_USER_ALL));
        btnUsersCurr.setSelection(preferences.getDefaultBoolean(QStatMonitorPreferenceConstants.P_USER_CURR));
        btnUsersCust.setSelection(preferences.getDefaultBoolean(QStatMonitorPreferenceConstants.P_USER_CUST));
        txtUser.setText(preferences.getDefaultString(QStatMonitorPreferenceConstants.P_USER));
    }

}