blob: 3eaee3525829e1b18015e80aa0814241aefdcbd0 [file] [log] [blame]
/*
* 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 com.google.eclipse.protobuf.ui.preferences.pages.Messages.*;
import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
import static org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn;
import static org.eclipse.xtext.util.Strings.isEmpty;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
import com.google.eclipse.protobuf.ui.preferences.pages.binding.*;
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;
}
}