blob: bb86501f8deb6ce8ee6f91356ad52deb3bb5aa4c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Robert Roth <robert.roth.off@gmail.com> - bug 184656
*******************************************************************************/
package org.eclipse.ant.internal.ui.preferences;
import org.eclipse.ant.internal.launching.AntLaunching;
import org.eclipse.ant.internal.launching.IAntLaunchingPreferenceConstants;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.IAntUIHelpContextIds;
import org.eclipse.ant.internal.ui.IAntUIPreferenceConstants;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
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.List;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import com.ibm.icu.text.MessageFormat;
public class AntPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
/**
* Allows us to override the default behavior of the default {@link IntegerFieldEditor} to work on a core preference context
*
* @since 3.6
*/
class AntIntegerFieldEditor extends IntegerFieldEditor {
String node = null, key = null;
int defaultvalue = -1;
/**
* Constructor
*
* @param node
* the identifier of the node we want to set the preference in, i.e. org.eclipse.ant.launching
* @param key
* the preference key to map the value to
* @param title
* the title of the field editor
* @param parent
* the parent to add the field editor to
* @param defaultvalue
* the default value to return when looking up stored values
*/
public AntIntegerFieldEditor(String node, String key, String title, Composite parent, int defaultvalue) {
super(key, title, parent);
this.node = node;
this.key = key;
this.defaultvalue = defaultvalue;
}
@Override
protected void doStore() {
InstanceScope.INSTANCE.getNode(node).putInt(key, Integer.parseInt(getStringValue()));
}
@Override
public void load() {
setStringValue(Integer.toString(Platform.getPreferencesService().getInt(node, key, defaultvalue, null)));
}
@Override
public void loadDefault() {
setStringValue(Integer.toString(DefaultScope.INSTANCE.getNode(AntLaunching.getUniqueIdentifier()).getInt(key, defaultvalue)));
}
}
private List fConsoleColorList;
private ColorSelector fConsoleColorSelector;
private IntegerFieldEditor timeout;
private BooleanFieldEditor workspacejre = null;
private BooleanFieldEditor fToolsWarningEditor = null;
// Array containing the message to display, the preference key, and the
// default value (initialized in storeInitialValues()) for each color preference
private final String[][] fAppearanceColorListModel = new String[][] {
{ AntPreferencesMessages.AntPreferencePage__Error__2, IAntUIPreferenceConstants.CONSOLE_ERROR_COLOR, null },
{ AntPreferencesMessages.AntPreferencePage__Warning__3, IAntUIPreferenceConstants.CONSOLE_WARNING_COLOR, null },
{ AntPreferencesMessages.AntPreferencePage_I_nformation__4, IAntUIPreferenceConstants.CONSOLE_INFO_COLOR, null },
{ AntPreferencesMessages.AntPreferencePage_Ve_rbose__5, IAntUIPreferenceConstants.CONSOLE_VERBOSE_COLOR, null },
{ AntPreferencesMessages.AntPreferencePage_Deb_ug__6, IAntUIPreferenceConstants.CONSOLE_DEBUG_COLOR, null }, };
/**
* Create the Ant page.
*/
public AntPreferencePage() {
super(GRID);
setDescription(AntPreferencesMessages.AntPreferencePage_General);
setPreferenceStore(AntUIPlugin.getDefault().getPreferenceStore());
}
@Override
protected void createFieldEditors() {
storeAppliedValues();
Font font = getFieldEditorParent().getFont();
Label label = new Label(getFieldEditorParent(), SWT.WRAP);
label.setText(AntPreferencesMessages.AntPreferencePage_Enter);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 3;
gd.widthHint = convertWidthInCharsToPixels(60);
label.setLayoutData(gd);
label.setLayoutData(gd);
label.setFont(font);
StringFieldEditor editor = new StringFieldEditor(IAntUIPreferenceConstants.ANT_FIND_BUILD_FILE_NAMES, AntPreferencesMessages.AntPreferencePage__Names__3, getFieldEditorParent());
addField(editor);
timeout = new AntIntegerFieldEditor(AntLaunching.getUniqueIdentifier(), IAntLaunchingPreferenceConstants.ANT_COMMUNICATION_TIMEOUT, AntPreferencesMessages.AntPreferencePage_13, getFieldEditorParent(), 20000);
int minValue = DefaultScope.INSTANCE.getNode(AntLaunching.getUniqueIdentifier()).getInt(IAntLaunchingPreferenceConstants.ANT_COMMUNICATION_TIMEOUT, 20000);
int maxValue = 1200000;
timeout.setValidRange(minValue, maxValue);
timeout.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
timeout.setErrorMessage(MessageFormat.format(AntPreferencesMessages.AntPreferencePage_14, new Object[] { Integer.valueOf(minValue),
Integer.valueOf(maxValue) }));
addField(timeout);
editor = new URLFieldEditor(IAntUIPreferenceConstants.DOCUMENTATION_URL, AntPreferencesMessages.AntPreferencePage_2, getFieldEditorParent());
addField(editor);
workspacejre = new BooleanFieldEditor(IAntUIPreferenceConstants.USE_WORKSPACE_JRE, AntPreferencesMessages.always_run_in_workspace_jre, getFieldEditorParent());
workspacejre.fillIntoGrid(getFieldEditorParent(), 3);
addField(workspacejre);
createSpace();
if (!AntUIPlugin.isMacOS()) {
// the mac does not have a tools.jar Bug 40778
label = new Label(getFieldEditorParent(), SWT.WRAP);
label.setText(AntPreferencesMessages.AntPreferencePage_0);
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 3;
gd.widthHint = convertWidthInCharsToPixels(60);
label.setLayoutData(gd);
label.setFont(font);
fToolsWarningEditor = new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_TOOLS_JAR_WARNING, AntPreferencesMessages.AntPreferencePage_1, getFieldEditorParent());
addField(fToolsWarningEditor);
createSpace();
}
addField(new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_ERROR_DIALOG, AntPreferencesMessages.AntPreferencePage_12, getFieldEditorParent()));
createSpace();
addField(new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_CREATE_MARKERS, AntPreferencesMessages.AntPreferencePage_15, getFieldEditorParent()));
label = new Label(getFieldEditorParent(), SWT.WRAP);
label.setText(AntPreferencesMessages.AntPreferencePage_16);
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 3;
gd.widthHint = convertWidthInCharsToPixels(60);
label.setLayoutData(gd);
label.setFont(font);
createSpace();
createColorComposite();
getPreferenceStore().addPropertyChangeListener(this);
}
private void createSpace() {
Label label = new Label(getFieldEditorParent(), SWT.NONE);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 3;
label.setLayoutData(gd);
}
/**
* Stores the initial values of the color preferences. The preference values are updated on the fly as the user edits them (instead of only when
* they press "Apply"). We need to store the old values so that we can reset them when the user chooses "Cancel".
*/
private void storeAppliedValues() {
IPreferenceStore store = getPreferenceStore();
for (int i = 0; i < fAppearanceColorListModel.length; i++) {
String preference = fAppearanceColorListModel[i][1];
fAppearanceColorListModel[i][2] = store.getString(preference);
}
}
private void createColorComposite() {
Font font = getFieldEditorParent().getFont();
Label label = new Label(getFieldEditorParent(), SWT.LEFT);
label.setText(AntPreferencesMessages.AntPreferencePage_Ant_Color_Options__6);
label.setFont(font);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
label.setLayoutData(gd);
Composite editorComposite = new Composite(getFieldEditorParent(), SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
editorComposite.setLayout(layout);
editorComposite.setFont(font);
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
gd.horizontalSpan = 2;
editorComposite.setLayoutData(gd);
fConsoleColorList = new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
gd.heightHint = convertHeightInCharsToPixels(8);
fConsoleColorList.setLayoutData(gd);
fConsoleColorList.setFont(font);
Composite stylesComposite = new Composite(editorComposite, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 2;
stylesComposite.setLayout(layout);
stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
stylesComposite.setFont(font);
label = new Label(stylesComposite, SWT.LEFT);
label.setText(AntPreferencesMessages.AntPreferencePage_Color__7);
label.setFont(font);
gd = new GridData();
gd.horizontalAlignment = GridData.BEGINNING;
label.setLayoutData(gd);
fConsoleColorSelector = new ColorSelector(stylesComposite);
Button foregroundColorButton = fConsoleColorSelector.getButton();
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalAlignment = GridData.BEGINNING;
foregroundColorButton.setLayoutData(gd);
foregroundColorButton.setFont(font);
fConsoleColorList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleAppearanceColorListSelection();
}
});
foregroundColorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int i = fConsoleColorList.getSelectionIndex();
if (i == -1) { // bug 85590
return;
}
String key = fAppearanceColorListModel[i][1];
PreferenceConverter.setValue(getPreferenceStore(), key, fConsoleColorSelector.getColorValue());
}
});
}
/**
* Restore all color preferences to their values when the page was opened.
*/
@Override
public boolean performCancel() {
for (String[] colorModel : fAppearanceColorListModel) {
String preference = colorModel[1];
PreferenceConverter.setValue(getPreferenceStore(), preference, StringConverter.asRGB(colorModel[2]));
}
return super.performCancel();
}
/**
* When the user applies the preferences, update the set of stored preferences so that we will fall back to the applied values on Cancel.
*/
@Override
public boolean performOk() {
storeAppliedValues();
return super.performOk();
}
private void handleAppearanceColorListSelection() {
int i = fConsoleColorList.getSelectionIndex();
if (i == -1) { // bug 85590
return;
}
String key = fAppearanceColorListModel[i][1];
RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), key);
fConsoleColorSelector.setColorValue(rgb);
}
@Override
protected Control createContents(Composite parent) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IAntUIHelpContextIds.ANT_PREFERENCE_PAGE);
return super.createContents(parent);
}
@Override
public void init(IWorkbench workbench) {
// do nothing
}
@Override
protected void initialize() {
super.initialize();
for (String[] colorModel : fAppearanceColorListModel) {
fConsoleColorList.add(colorModel[0]);
}
fConsoleColorList.getDisplay().asyncExec(() -> {
if (fConsoleColorList != null && !fConsoleColorList.isDisposed()) {
fConsoleColorList.select(0);
handleAppearanceColorListSelection();
}
});
}
@Override
protected void performDefaults() {
for (String[] colorModel : fAppearanceColorListModel) {
String key = colorModel[1];
PreferenceConverter.setValue(getPreferenceStore(), key, PreferenceConverter.getDefaultColor(getPreferenceStore(), key));
}
handleAppearanceColorListSelection();
super.performDefaults();
}
@Override
public void dispose() {
getPreferenceStore().removePropertyChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IAntUIPreferenceConstants.ANT_TOOLS_JAR_WARNING)) {
if (fToolsWarningEditor != null) {
fToolsWarningEditor.load();
}
} else {
super.propertyChange(event);
}
}
}