org.apache.felix.sigil.eclipse.ui.internal.preferences.VersionsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.felix.sigil.eclipse.ui.internal.preferences.VersionsPreferencePage.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.felix.sigil.eclipse.ui.internal.preferences;

import org.apache.felix.sigil.common.osgi.VersionRange;
import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
import org.apache.felix.sigil.common.osgi.VersionTable;
import org.apache.felix.sigil.eclipse.SigilCore;
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.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.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;
import org.osgi.framework.Version;

public class VersionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    private static final Version SAMPLE_VERSION = VersionTable.getVersion(1, 2, 3, "qualifier");

    private Button btnLowerBoundExact;
    private Button btnLowerBoundMicro;
    private Button btnLowerBoundMinor;
    private Button btnLowerBoundMajor;
    private Button btnLowerBoundAny;

    private Button btnUpperBoundExact;
    private Button btnUpperBoundMicro;
    private Button btnUpperBoundMinor;
    private Button btnUpperBoundMajor;
    private Button btnUpperBoundAny;

    private Text txtSampleVersion;
    private Label lblCalculatedRange;
    private Text txtMatchVersion;
    private Label lblMatchResult;

    private VersionRangeBoundingRule lowerBoundRule;
    private VersionRangeBoundingRule upperBoundRule;

    private Version sampleVersion = SAMPLE_VERSION;
    private Version matchVersion = null;

    public VersionsPreferencePage() {
        super();
        setDescription(
                "Specify the Lower and Upper bounds for a default version range calculated from a point version, e.g. \"1.2.3.qualifier\"");
    }

    @Override
    protected Control createContents(Composite parent) {
        // Create controls
        Composite composite = new Composite(parent, SWT.NONE);

        Group grpLowerBound = new Group(composite, SWT.NONE);
        grpLowerBound.setText("Lower Bound");
        btnLowerBoundExact = new Button(grpLowerBound, SWT.RADIO);
        btnLowerBoundExact.setText("Exact e.g. [1.2.3.qualifer, ...)");
        btnLowerBoundMicro = new Button(grpLowerBound, SWT.RADIO);
        btnLowerBoundMicro.setText("Micro e.g. [1.2.3, ...)");
        btnLowerBoundMinor = new Button(grpLowerBound, SWT.RADIO);
        btnLowerBoundMinor.setText("Minor e.g. [1.2, ...)");
        btnLowerBoundMajor = new Button(grpLowerBound, SWT.RADIO);
        btnLowerBoundMajor.setText("Major e.g. [1, ...)");
        btnLowerBoundAny = new Button(grpLowerBound, SWT.RADIO);
        btnLowerBoundAny.setText("Any e.g. [0, ...)");

        Group grpUpperBound = new Group(composite, SWT.NONE);
        grpUpperBound.setText("Upper Bound");

        btnUpperBoundExact = new Button(grpUpperBound, SWT.RADIO);
        btnUpperBoundExact.setText("Exact e.g. [..., 1.2.3.qualifer]");
        btnUpperBoundMicro = new Button(grpUpperBound, SWT.RADIO);
        btnUpperBoundMicro.setText("Micro e.g. [..., 1.2.4)");
        btnUpperBoundMinor = new Button(grpUpperBound, SWT.RADIO);
        btnUpperBoundMinor.setText("Minor e.g. [..., 1.3)");
        btnUpperBoundMajor = new Button(grpUpperBound, SWT.RADIO);
        btnUpperBoundMajor.setText("Major e.g. [..., 2)");
        btnUpperBoundAny = new Button(grpUpperBound, SWT.RADIO);
        btnUpperBoundAny.setText("Any e.g. [..., \u221e)");

        Group grpRangeTest = new Group(composite, SWT.NONE);
        grpRangeTest.setText("Range Test");
        new Label(grpRangeTest, SWT.NONE).setText("Sample Input Version: ");
        txtSampleVersion = new Text(grpRangeTest, SWT.BORDER);
        new Label(grpRangeTest, SWT.NONE).setText("Calculated Version Range: ");
        lblCalculatedRange = new Label(grpRangeTest, SWT.NONE);

        new Label(grpRangeTest, SWT.NONE).setText("Test: ");
        txtMatchVersion = new Text(grpRangeTest, SWT.BORDER);
        new Label(grpRangeTest, SWT.NONE).setText("Result: ");
        lblMatchResult = new Label(grpRangeTest, SWT.NONE);

        // Initialize controls
        loadPreferences(false);
        updateRadioButtons();

        txtSampleVersion.setText(sampleVersion.toString());
        updateCalculatedRange();

        // Add listeners
        SelectionListener buttonListener = new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                readRadioButtons();
                updateCalculatedRange();
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                readRadioButtons();
                updateCalculatedRange();
            }
        };
        btnLowerBoundAny.addSelectionListener(buttonListener);
        btnLowerBoundMajor.addSelectionListener(buttonListener);
        btnLowerBoundMinor.addSelectionListener(buttonListener);
        btnLowerBoundMicro.addSelectionListener(buttonListener);
        btnLowerBoundExact.addSelectionListener(buttonListener);

        btnUpperBoundAny.addSelectionListener(buttonListener);
        btnUpperBoundMajor.addSelectionListener(buttonListener);
        btnUpperBoundMinor.addSelectionListener(buttonListener);
        btnUpperBoundMicro.addSelectionListener(buttonListener);
        btnUpperBoundExact.addSelectionListener(buttonListener);

        txtSampleVersion.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                try {
                    sampleVersion = VersionTable.getVersion(txtSampleVersion.getText());
                } catch (IllegalArgumentException x) {
                    sampleVersion = null;
                }
                updateCalculatedRange();
            }
        });
        txtMatchVersion.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                try {
                    matchVersion = VersionTable.getVersion(txtMatchVersion.getText());
                } catch (IllegalArgumentException x) {
                    matchVersion = null;
                }
                updateCalculatedRange();
            }
        });

        // Layout
        GridLayout layout = new GridLayout(1, false);
        layout.verticalSpacing = 20;
        composite.setLayout(layout);

        grpLowerBound.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        grpLowerBound.setLayout(new GridLayout(1, false));

        grpUpperBound.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        grpUpperBound.setLayout(new GridLayout(1, false));

        grpRangeTest.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
        grpRangeTest.setLayout(new GridLayout(2, false));

        txtSampleVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        lblCalculatedRange.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        txtMatchVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        lblMatchResult.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        return composite;
    }

    private void loadPreferences(boolean useDefaults) {
        IPreferenceStore prefs = getPreferenceStore();
        String lowerBoundStr;
        if (useDefaults) {
            lowerBoundStr = prefs.getDefaultString(SigilCore.DEFAULT_VERSION_LOWER_BOUND);
        } else {
            lowerBoundStr = prefs.getString(SigilCore.DEFAULT_VERSION_LOWER_BOUND);
        }

        String upperBoundStr;
        if (useDefaults) {
            upperBoundStr = prefs.getDefaultString(SigilCore.DEFAULT_VERSION_UPPER_BOUND);
        } else {
            upperBoundStr = prefs.getString(SigilCore.DEFAULT_VERSION_UPPER_BOUND);
        }

        lowerBoundRule = VersionRangeBoundingRule.valueOf(lowerBoundStr);
        upperBoundRule = VersionRangeBoundingRule.valueOf(upperBoundStr);
    }

    private void updateRadioButtons() {
        switch (lowerBoundRule) {
        case Exact:
            btnLowerBoundExact.setSelection(true);
            btnLowerBoundMicro.setSelection(false);
            btnLowerBoundMinor.setSelection(false);
            btnLowerBoundMajor.setSelection(false);
            btnLowerBoundAny.setSelection(false);
            break;
        case Micro:
            btnLowerBoundExact.setSelection(false);
            btnLowerBoundMicro.setSelection(true);
            btnLowerBoundMinor.setSelection(false);
            btnLowerBoundMajor.setSelection(false);
            btnLowerBoundAny.setSelection(false);
            break;
        case Minor:
            btnLowerBoundExact.setSelection(false);
            btnLowerBoundMicro.setSelection(false);
            btnLowerBoundMinor.setSelection(true);
            btnLowerBoundMajor.setSelection(false);
            btnLowerBoundAny.setSelection(false);
            break;
        case Major:
            btnLowerBoundExact.setSelection(false);
            btnLowerBoundMicro.setSelection(false);
            btnLowerBoundMinor.setSelection(false);
            btnLowerBoundMajor.setSelection(true);
            btnLowerBoundAny.setSelection(false);
            break;
        case Any:
            btnLowerBoundExact.setSelection(false);
            btnLowerBoundMicro.setSelection(false);
            btnLowerBoundMinor.setSelection(false);
            btnLowerBoundMajor.setSelection(false);
            btnLowerBoundAny.setSelection(true);
            break;
        }

        switch (upperBoundRule) {
        case Exact:
            btnUpperBoundExact.setSelection(true);
            btnUpperBoundMicro.setSelection(false);
            btnUpperBoundMinor.setSelection(false);
            btnUpperBoundMajor.setSelection(false);
            btnUpperBoundAny.setSelection(false);
            break;
        case Micro:
            btnUpperBoundExact.setSelection(false);
            btnUpperBoundMicro.setSelection(true);
            btnUpperBoundMinor.setSelection(false);
            btnUpperBoundMajor.setSelection(false);
            btnUpperBoundAny.setSelection(false);
            break;
        case Minor:
            btnUpperBoundExact.setSelection(false);
            btnUpperBoundMicro.setSelection(false);
            btnUpperBoundMinor.setSelection(true);
            btnUpperBoundMajor.setSelection(false);
            btnUpperBoundAny.setSelection(false);
            break;
        case Major:
            btnUpperBoundExact.setSelection(false);
            btnUpperBoundMicro.setSelection(false);
            btnUpperBoundMinor.setSelection(false);
            btnUpperBoundMajor.setSelection(true);
            btnUpperBoundAny.setSelection(false);
            break;
        case Any:
            btnUpperBoundExact.setSelection(false);
            btnUpperBoundMicro.setSelection(false);
            btnUpperBoundMinor.setSelection(false);
            btnUpperBoundMajor.setSelection(false);
            btnUpperBoundAny.setSelection(true);
        }
    }

    private void readRadioButtons() {
        if (btnLowerBoundExact.getSelection()) {
            lowerBoundRule = VersionRangeBoundingRule.Exact;
        } else if (btnLowerBoundMicro.getSelection()) {
            lowerBoundRule = VersionRangeBoundingRule.Micro;
        } else if (btnLowerBoundMinor.getSelection()) {
            lowerBoundRule = VersionRangeBoundingRule.Minor;
        } else if (btnLowerBoundMajor.getSelection()) {
            lowerBoundRule = VersionRangeBoundingRule.Major;
        } else if (btnLowerBoundAny.getSelection()) {
            lowerBoundRule = VersionRangeBoundingRule.Any;
        }

        if (btnUpperBoundExact.getSelection()) {
            upperBoundRule = VersionRangeBoundingRule.Exact;
        } else if (btnUpperBoundMicro.getSelection()) {
            upperBoundRule = VersionRangeBoundingRule.Micro;
        } else if (btnUpperBoundMinor.getSelection()) {
            upperBoundRule = VersionRangeBoundingRule.Minor;
        } else if (btnUpperBoundMajor.getSelection()) {
            upperBoundRule = VersionRangeBoundingRule.Major;
        } else if (btnUpperBoundAny.getSelection()) {
            upperBoundRule = VersionRangeBoundingRule.Any;
        }
    }

    private void updateCalculatedRange() {
        VersionRange range;
        String rangeStr;
        String matchResult;

        if (sampleVersion == null) {
            range = null;
            rangeStr = "";
        } else {
            range = VersionRange.newInstance(sampleVersion, lowerBoundRule, upperBoundRule);
            rangeStr = range.toString();
        }
        lblCalculatedRange.setText(rangeStr);

        if (matchVersion == null || range == null) {
            matchResult = "";
        } else {
            matchResult = range.contains(matchVersion) ? "MATCH!" : "No Match";
        }
        lblMatchResult.setText(matchResult);
    }

    public void init(IWorkbench workbench) {
    }

    @Override
    protected IPreferenceStore doGetPreferenceStore() {
        return SigilCore.getDefault().getPreferenceStore();
    }

    @Override
    public boolean performOk() {
        getPreferenceStore().setValue(SigilCore.DEFAULT_VERSION_LOWER_BOUND, lowerBoundRule.name());
        getPreferenceStore().setValue(SigilCore.DEFAULT_VERSION_UPPER_BOUND, upperBoundRule.name());

        return true;
    }

    @Override
    protected void performDefaults() {
        super.performDefaults();
        loadPreferences(true);
        updateRadioButtons();
        updateCalculatedRange();
    }

}