/*******************************************************************************
* Copyright (c) 2012 - 2014 Pivotal Software, 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
*
* Contributors:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.springsource.ide.eclipse.dashboard.internal.ui.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.springsource.ide.eclipse.commons.core.ResourceProvider;
import org.springsource.ide.eclipse.commons.core.ResourceProvider.Property;
import org.springsource.ide.eclipse.commons.core.preferences.StsProperties;
import org.springsource.ide.eclipse.dashboard.internal.ui.IIdeUiConstants;
import org.springsource.ide.eclipse.dashboard.internal.ui.IdeUiPlugin;
import org.springsource.ide.eclipse.dashboard.internal.ui.util.IdeUiUtils;
/**
* @author Steffen Pingel
*/
public class MainPreferencesPage extends PreferencePage implements IWorkbenchPreferencePage {
private class PropertyEditor {
private Text control;
private final Property property;
public PropertyEditor(Property property) {
this.property = property;
}
public Control createControl(Composite parent) {
int style = SWT.BORDER;
if (property.isMultiValue()) {
style |= SWT.MULTI | SWT.V_SCROLL;
}
control = new Text(parent, style);
return control;
}
public Label createLabel(Composite composite) {
Label label = new Label(composite, SWT.NONE);
if (property.getLabel() != null) {
label.setText(property.getLabel() + ":");
}
return label;
}
public boolean isControlOnSeparateRow() {
return property.isMultiValue();
}
public void performDefaults() {
setValue(property.getDefaultValue());
}
public void performOk() {
property.setValue(control.getText());
}
public void performReset() {
setValue(property.getValue());
}
private void setValue(String value) {
control.setText((value) != null ? value : "");
}
}
private static final int HEIGHT_MULTI_LINE_TEXT = 60;
private List<PropertyEditor> editors;
private Button useOldDashboardButton;
private Button updateNewsFeed;
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
createUseOldDasboardButton(composite);
createUpdateNewsFeedButton(composite);
for (PropertyEditor editor : editors) {
Label label = editor.createLabel(composite);
GridDataFactory.fillDefaults().applyTo(label);
if (editor.isControlOnSeparateRow()) {
((GridData) label.getLayoutData()).horizontalSpan = 2;
}
Control control = editor.createControl(composite);
GridDataFactory.fillDefaults().grab(true, false).applyTo(control);
if (editor.isControlOnSeparateRow()) {
((GridData) control.getLayoutData()).horizontalSpan = 2;
((GridData) control.getLayoutData()).heightHint = HEIGHT_MULTI_LINE_TEXT;
}
editor.performReset();
}
return composite;
}
private void createUseOldDasboardButton(Composite composite) {
useOldDashboardButton = new Button(composite, SWT.CHECK);
useOldDashboardButton.setText("Use Old Dashboard");
GridDataFactory.fillDefaults().span(2, 1).applyTo(useOldDashboardButton);
useOldDashboardButton.setSelection(getUseOldDashboard());
useOldDashboardButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
updateDashboardWarning();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
updateDashboardWarning();
}
private void createUpdateNewsFeedButton(Composite composite) {
updateNewsFeed = new Button(composite, SWT.CHECK);
updateNewsFeed.setText("News Feed Updates");
GridDataFactory.fillDefaults().span(2, 1).applyTo(updateNewsFeed);
updateNewsFeed.setSelection(getPreferenceStore().getBoolean(IIdeUiConstants.PREF_UPDATE_DASHBOARD_NEWS_FEED));
}
private boolean getUseOldDashboard() {
String value = getPreferenceStore().getString(IIdeUiConstants.PREF_USE_OLD_DASHOARD);
if (value == null) {
return getDefaultUseOldDashboard();
}
return Boolean.valueOf(value);
}
private boolean getDefaultUseOldDashboard() {
boolean useNew = StsProperties.getInstance().get("sts.new.dashboard.enabled", false);
return !useNew;
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return IdeUiPlugin.getDefault().getPreferenceStore();
}
public void init(IWorkbench workbench) {
editors = new ArrayList<PropertyEditor>();
for (Property property : ResourceProvider.getInstance().getProperties()) {
if (property.isUserConfigurable()) {
PropertyEditor editor = new PropertyEditor(property);
editors.add(editor);
}
}
}
@Override
protected void performDefaults() {
useOldDashboardButton.setSelection(getPreferenceStore()
.getDefaultBoolean(IIdeUiConstants.PREF_USE_OLD_DASHOARD));
updateNewsFeed.setSelection(getPreferenceStore().getDefaultBoolean(
IIdeUiConstants.PREF_UPDATE_DASHBOARD_NEWS_FEED));
for (PropertyEditor editor : editors) {
editor.performDefaults();
}
super.performDefaults();
updateDashboardWarning();
}
@Override
public boolean performOk() {
for (PropertyEditor editor : editors) {
editor.performOk();
}
setBoolean(getPreferenceStore(), IIdeUiConstants.PREF_USE_OLD_DASHOARD, useOldDashboardButton.getSelection());
setBoolean(getPreferenceStore(), IIdeUiConstants.PREF_UPDATE_DASHBOARD_NEWS_FEED, updateNewsFeed.getSelection());
return super.performOk();
}
/**
* Set boolean preference, taking care to only actually set it if it differs
* from the default value (so that if default value changes at a later
* time...)
*/
private void setBoolean(IPreferenceStore preferenceStore, String propName, boolean value) {
boolean defaultValue = preferenceStore.getDefaultBoolean(propName);
if (value == defaultValue) {
preferenceStore.setToDefault(propName);
}
else {
preferenceStore.setValue(propName, value);
}
}
private void updateDashboardWarning() {
if (!IdeUiPlugin.getDefault().supportsNewDashboard(new NullProgressMonitor())
&& !useOldDashboardButton.getSelection()) {
setMessage("Current environment does not support new dashboard. Upgrade to Eclipse "
+ IdeUiPlugin.JAVAFX_MINIMUM_ECLIPSE_VERSION + " and Java "
+ IdeUiPlugin.JAVAFX_MINIMUM_JRE_VERSION + " or newer. Will fall back to old dashboard.", WARNING);
}
else {
setMessage(null);
}
}
}