net.harawata.mybatipse.preference.ScopedFieldEditorPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for net.harawata.mybatipse.preference.ScopedFieldEditorPreferencePage.java

Source

/*-******************************************************************************
 * Copyright (c) 2014 Iwao AVE!.
 * 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:
 *    Iwao AVE! - initial API and implementation and/or initial documentation
 *******************************************************************************/

package net.harawata.mybatipse.preference;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;

/**
 * @see https://www.eclipse.org/articles/Article-Mutatis-mutandis/overlay-pages.html
 * @author Iwao AVE!
 */
public abstract class ScopedFieldEditorPreferencePage extends FieldEditorPreferencePage
        implements IWorkbenchPropertyPage {
    public static final String USE_PROJECT_SETTINGS = "useProjectSettings";

    private Button useWorkspaceSettingsButton;

    private Button useProjectSettingsButton;

    private List<FieldEditor> editors = new ArrayList<FieldEditor>();

    private IAdaptable element;

    protected Control createContents(Composite parent) {
        if (isProjectPropertyPage()) {
            createProjectSpecificControls(parent);
        }
        return super.createContents(parent);
    }

    private void createProjectSpecificControls(Composite parent) {
        Composite comp = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Composite radioGroup = new Composite(comp, SWT.NONE);
        radioGroup.setLayout(new GridLayout());
        radioGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        useWorkspaceSettingsButton = createRadioButton(radioGroup, "Use workspace settings");
        useProjectSettingsButton = createRadioButton(radioGroup, "Use project settings");

        if (getPreferenceStore().getBoolean(USE_PROJECT_SETTINGS)) {
            useProjectSettingsButton.setSelection(true);
        } else {
            useWorkspaceSettingsButton.setSelection(true);
        }
    }

    private Button createRadioButton(Composite parent, String label) {
        final Button button = new Button(parent, SWT.RADIO);
        button.setText(label);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateFieldEditors();
            }
        });
        return button;
    }

    private void updateFieldEditors() {
        boolean enabled = useProjectSettingsButton.getSelection();
        updateFieldEditors(enabled);
    }

    protected void updateFieldEditors(boolean enabled) {
        Composite parent = getFieldEditorParent();
        for (FieldEditor editor : editors) {
            editor.setEnabled(enabled, parent);
        }
    }

    @Override
    public void createControl(Composite parent) {
        super.createControl(parent);
        if (isProjectPropertyPage()) {
            updateFieldEditors();
        }
    }

    @Override
    public boolean performOk() {
        boolean result = super.performOk();
        if (result && isProjectPropertyPage()) {
            // try
            // {
            ScopedPreferenceStore store = (ScopedPreferenceStore) getPreferenceStore();
            store.setValue(USE_PROJECT_SETTINGS, useProjectSettingsButton.getSelection());
            // store.save();
            // }
            // catch (IOException e)
            // {
            // e.printStackTrace();
            // }
        }
        return result;
    }

    @Override
    protected void performDefaults() {
        if (isProjectPropertyPage()) {
            useWorkspaceSettingsButton.setSelection(true);
            useProjectSettingsButton.setSelection(false);
            updateFieldEditors();
        }
        super.performDefaults();
    }

    @Override
    protected void addField(FieldEditor editor) {
        editors.add(editor);
        super.addField(editor);
    }

    @Override
    public IAdaptable getElement() {
        return element;
    }

    @Override
    public void setElement(IAdaptable element) {
        this.element = element;
        setPreferenceStore(new ScopedPreferenceStore(new ProjectScope(getProject()), getPluginId()));
    }

    protected IProject getProject() {
        return element instanceof IJavaProject ? ((IJavaProject) element).getProject() : (IProject) element;
    }

    public boolean isProjectPropertyPage() {
        return element != null;
    }

    public ScopedFieldEditorPreferencePage(int style) {
        super(style);
    }

    public ScopedFieldEditorPreferencePage(String title, int style) {
        super(title, style);
    }

    protected abstract String getPluginId();
}