com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage.java

Source

/*
 * Copyright (c) 2011 Google Inc.
 *
 * 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 com.google.eclipse.protobuf.ui.preferences.pages;

import static org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn;
import static org.eclipse.xtext.util.Strings.isEmpty;

import static com.google.eclipse.protobuf.ui.preferences.pages.Messages.configureWorkspaceSettings;
import static com.google.eclipse.protobuf.ui.preferences.pages.Messages.enableProjectSettings;
import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;

import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
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.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;

import com.google.eclipse.protobuf.ui.preferences.pages.binding.Preference;
import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceFactory;
import com.google.inject.Inject;

/**
 * Base class for pages that set up both "Workspace Preferences" and "Project Properties."
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public abstract class PreferenceAndPropertyPage extends PreferencePage
        implements IWorkbenchPreferencePage, IWorkbenchPropertyPage {
    private Button btnEnableProjectSettings;
    private Link lnkEnableWorkspaceSettings;

    private IProject project;
    private Map<String, Object> dataMap;

    @Inject
    private IPreferenceStoreAccess preferenceStoreAccess;

    private final PreferenceBinder preferenceBinder = new PreferenceBinder();

    @Override
    protected Control createContents(Composite parent) {
        Composite contents = contentParent(parent);
        doCreateContents(contents);
        PreferenceFactory preferenceFactory = new PreferenceFactory(getPreferenceStore());
        if (isPropertyPage()) {
            setupBindingOfBtnEnabledProjectSettings(preferenceFactory);
        }
        setupBinding(preferenceBinder, preferenceFactory);
        preferenceBinder.applyValues();
        updateContents();
        return contents;
    }

    /**
     * Creates the <code>{@link Composite}</code> that will contain all the UI controls in this preference page. By
     * default it returns a <code>{@link Composite}</code> that contains the options to switch between "Project" and
     * "Workspace" settings.
     * @param parent the parent {@code Composite}.
     * @return the created {@code Composite}.
     */
    protected Composite contentParent(Composite parent) {
        return switchBetweenProjectAndWorkspaceSettings(parent);
    }

    private Composite switchBetweenProjectAndWorkspaceSettings(Composite parent) {
        // generated by WindowBuilder
        Composite contents = new Composite(parent, NONE);
        contents.setLayout(new GridLayout(3, false));
        if (isPropertyPage()) {
            btnEnableProjectSettings = new Button(contents, SWT.CHECK);
            btnEnableProjectSettings.setText(enableProjectSettings);

            lnkEnableWorkspaceSettings = new Link(contents, SWT.NONE);
            lnkEnableWorkspaceSettings.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
            lnkEnableWorkspaceSettings.setText("<a>" + configureWorkspaceSettings + "</a>");

            Label label = new Label(contents, SWT.SEPARATOR | SWT.HORIZONTAL);
            label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        }
        new Label(contents, SWT.NONE);
        addEventListeners();
        return contents;
    }

    private void addEventListeners() {
        if (isPropertyPage()) {
            btnEnableProjectSettings.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    onProjectSettingsActivation(areProjectSettingsActive());
                    updateEnableWorkspaceSettingsLink();
                }
            });
            lnkEnableWorkspaceSettings.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    openWorkspacePreferences();
                }
            });
        }
    }

    /**
     * Notification that the "Enable project specific settings" check button has been selected.
     * @param projectSettingsActive indicates the selection of the "Enable project specific settings" check button.
     */
    protected abstract void onProjectSettingsActivation(boolean projectSettingsActive);

    private void openWorkspacePreferences() {
        String preferencePageId = preferencePageId();
        createPreferenceDialogOn(getShell(), preferencePageId, new String[] { preferencePageId }, dataMap).open();
    }

    /**
     * Creates the contents of this preference page.
     * @param parent the parent {@code Composite}.
     */
    protected abstract void doCreateContents(Composite parent);

    private void setupBindingOfBtnEnabledProjectSettings(PreferenceFactory factory) {
        String preferenceName = enableProjectSettingsPreferenceName();
        if (isEmpty(preferenceName)) {
            return;
        }
        Preference<Boolean> preference = factory.newBooleanPreference(preferenceName);
        preferenceBinder.add(bindSelectionOf(btnEnableProjectSettings).to(preference));
    }

    /**
     * Returns the name of the preference that specifies whether this page is a "Project Properties" or a "Workspace
     * Preferences" page.
     * @return the name of the preference that specifies whether this page is a "Project Properties" or a "Workspace
     * Preferences" page.
     */
    protected abstract String enableProjectSettingsPreferenceName();

    /**
     * Sets up data binding.
     * @param binder binds preferences to widgets.
     * @param factory factory of preferences.
     */
    protected abstract void setupBinding(PreferenceBinder binder, PreferenceFactory factory);

    /**
     * Returns the id of this preference page.
     * @return the id of this preference page.
     */
    protected abstract String preferencePageId();

    /**
     * Returns the <code>{@link IProject}</code> that owns the properties shown in this page.
     * @return the project that owns the properties shown in this page.
     */
    @Override
    public final IAdaptable getElement() {
        return project;
    }

    /**
     * Sets the <code>{@link IProject}</code> that owns the properties shown in this page.
     * @param element the {@code IAdaptable} associated with the project that owns the properties shown in this page.
     */
    @Override
    public final void setElement(IAdaptable element) {
        this.project = (IProject) element.getAdapter(IProject.class);
    }

    /**
     * Returns the preference store of this preference page.
     * @return the preference store.
     */
    @Override
    protected final IPreferenceStore doGetPreferenceStore() {
        if (isPropertyPage()) {
            return preferenceStoreAccess.getWritablePreferenceStore(currentProject());
        }
        return preferenceStoreAccess.getWritablePreferenceStore();
    }

    /**
     * Indicates whether this page is a "Project Properties" or a "Workspace Preferences" page.
     * @return {@code true} if this page is a "Project Properties" page, or {@code false} if this page is a
     * "Workspace Preferences" page.
     */
    protected final boolean isPropertyPage() {
        return project != null;
    }

    private IProject currentProject() {
        if (project == null) {
            throw new IllegalStateException("Not a property page case, but current project was requested.");
        }
        return project;
    }

    /** {@inheritDoc} */
    @SuppressWarnings("unchecked")
    @Override
    public final void applyData(Object data) {
        if (data instanceof Map) {
            this.dataMap = (Map<String, Object>) data;
        }
    }

    /**
     * Activates or deactivates the project-specific settings.
     * @param active indicates whether the project-specific settings should be active or not.
     */
    protected final void activateProjectSettings(boolean active) {
        btnEnableProjectSettings.setSelection(active);
        updateEnableWorkspaceSettingsLink();
    }

    private void updateEnableWorkspaceSettingsLink() {
        lnkEnableWorkspaceSettings.setEnabled(!areProjectSettingsActive());
    }

    /**
     * Indicates if the project-specific settings are active or not.
     * @return {@code true} if the project-specific settings are active; {@code false} otherwise.
     */
    protected final boolean areProjectSettingsActive() {
        return btnEnableProjectSettings.getSelection();
    }

    /** {@inheritDoc} */
    @Override
    public void init(IWorkbench workbench) {
    }

    @Override
    public final boolean performOk() {
        preferenceBinder.saveValues();
        okPerformed();
        return true;
    }

    /** Method invoked after this page's values have been saved. By default this method does nothing. */
    protected void okPerformed() {
    }

    @Override
    protected final void performDefaults() {
        preferenceBinder.applyDefaults();
        updateContents();
        pageIsNowValid();
        super.performDefaults();
    }

    /** Refreshes this page with the stored/default preference values. */
    protected void updateContents() {
    }

    /** Marks this page as "valid." */
    protected final void pageIsNowValid() {
        setErrorMessage(null);
        setValid(true);
    }

    /**
     * Marks this page as "invalid."
     * @param errorMessage the error message to display.
     */
    protected final void pageIsNowInvalid(String errorMessage) {
        setErrorMessage(errorMessage);
        setValid(false);
    }

    /**
     * Returns the project whose properties are being changed.
     * @return the project whose properties are being changed, or {@code null} if this page is updating workspace-level
     * preferences.
     */
    protected final IProject project() {
        return project;
    }
}