blob: b84655022ab33699603d0ac19f7389ad443aa194 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 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
* Anton Leherbauer (Wind River Systems)
* Thomas Corbat (IFS)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.Separator;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.osgi.util.NLS;
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.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
public class ScalabilityPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
// Files with this number of lines will trigger scalability mode
private IntegerFieldEditor fLinesToTrigger;
private Button fEnableAll;
private Button fReconciler;
private Button fSyntaxColor;
private Button fSemanticHighlighting;
private Button fContentAssist;
private Button fContentAssistAutoActivation;
private ScalabilityIntegerFieldEditor fMaximumTrivialExpressions;
private ScalabilityIntegerFieldEditor fMaximumTokens;
private final Map<Object, String> fCheckBoxes = new HashMap<>();
/**
* List of master/slave listeners when there's a dependency.
*
* @see #createDependency(Button, String, Control)
*/
private final ArrayList<Object> fMasterSlaveListeners = new ArrayList<>();
public ScalabilityPreferencePage() {
setPreferenceStore(PreferenceConstants.getPreferenceStore());
setDescription(PreferencesMessages.ScalabilityPreferencePage_description);
}
/**
* Creates a button with the given label and sets the default configuration data.
*/
private Button createCheckButton(Composite parent, String label, String key) {
Button button = new Button(parent, SWT.CHECK | SWT.LEFT);
button.setText(label);
// FieldEditor GridData
GridData data = new GridData();
button.setLayoutData(data);
fCheckBoxes.put(button, key);
return button;
}
private void initFields() {
IPreferenceStore prefs = getPreferenceStore();
Iterator<Object> iter = fCheckBoxes.keySet().iterator();
while (iter.hasNext()) {
Button b = (Button) iter.next();
String key = fCheckBoxes.get(b);
b.setSelection(prefs.getBoolean(key));
}
// Update slaves
iter = fMasterSlaveListeners.iterator();
while (iter.hasNext()) {
SelectionListener listener = (SelectionListener) iter.next();
listener.widgetSelected(null);
}
fLinesToTrigger.setStringValue(Integer.toString(prefs.getInt(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES)));
fMaximumTrivialExpressions.load();
fMaximumTokens.load();
}
/*
* @see PreferencePage#createControl(Composite)
*/
@Override
public void createControl(Composite parent) {
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.SCALABILITY_PREFERENCE_PAGE);
}
/*
* @see PreferencePage#createContents(Composite)
*/
@Override
protected Control createContents(Composite parent) {
initializeDialogUnits(parent);
int nColumns = 1;
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = 0;
layout.numColumns = nColumns;
composite.setLayout(layout);
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
composite.setLayoutData(data);
createDetectionSettings(composite);
new Separator().doFillIntoGrid(composite, nColumns);
createScalabilityModeSettings(composite);
new Separator().doFillIntoGrid(composite, nColumns);
createParserSettings(composite);
new Separator().doFillIntoGrid(composite, nColumns);
String noteTitle = PreferencesMessages.ScalabilityPreferencePage_note;
String noteMessage = PreferencesMessages.ScalabilityPreferencePage_preferenceOnlyForNewEditors;
Composite noteControl = createNoteComposite(JFaceResources.getDialogFont(), composite, noteTitle, noteMessage);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
noteControl.setLayoutData(gd);
initFields();
Dialog.applyDialogFont(composite);
return composite;
}
/**
* Creates composite group and sets the default layout data.
*
* @param parent
* the parent of the new composite
* @param numColumns
* the number of columns for the new composite
* @param labelText
* the text label of the new composite
* @return the newly-created composite
*/
private Composite createGroupComposite(Composite parent, int numColumns, String labelText) {
return ControlFactory.createGroup(parent, labelText, numColumns);
}
/**
* Create the view setting preferences composite widget
*/
private void createDetectionSettings(Composite parent) {
Composite group = createGroupComposite(parent, 1,
PreferencesMessages.ScalabilityPreferencePage_detection_group_label);
createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_detection_label,
PreferenceConstants.SCALABILITY_ALERT);
Composite comp = new Composite(group, SWT.NONE);
fLinesToTrigger = createIntegerField(comp, PreferenceConstants.SCALABILITY_NUMBER_OF_LINES,
PreferencesMessages.ScalabilityPreferencePage_trigger_lines_label, 1, Integer.MAX_VALUE);
}
/**
* Create the view setting preferences composite widget
*/
private void createScalabilityModeSettings(Composite parent) {
Composite group = createGroupComposite(parent, 1,
PreferencesMessages.ScalabilityPreferencePage_scalabilityMode_group_label);
fEnableAll = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_scalabilityMode_label,
PreferenceConstants.SCALABILITY_ENABLE_ALL);
fReconciler = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_reconciler_label,
PreferenceConstants.SCALABILITY_RECONCILER);
createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fReconciler, true);
fSemanticHighlighting = createCheckButton(group,
PreferencesMessages.ScalabilityPreferencePage_semanticHighlighting_label,
PreferenceConstants.SCALABILITY_SEMANTIC_HIGHLIGHT);
createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fSemanticHighlighting, true);
fSyntaxColor = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_syntaxColor_label,
PreferenceConstants.SCALABILITY_SYNTAX_COLOR);
createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fSyntaxColor, true);
fContentAssist = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_contentAssist_label,
PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST);
createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fContentAssist, true);
fContentAssistAutoActivation = createCheckButton(group,
PreferencesMessages.ScalabilityPreferencePage_contentAssist_autoActivation,
PreferenceConstants.SCALABILITY_CONTENT_ASSIST_AUTO_ACTIVATION);
createDependency(fContentAssist, PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST,
fContentAssistAutoActivation, true);
createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fContentAssistAutoActivation, false);
}
private void createParserSettings(Composite parent) {
Composite group = createGroupComposite(parent, 1,
PreferencesMessages.ScalabilityPreferencePage_parserSettings_group_label);
fMaximumTrivialExpressions = createScalabilityIntegerField(group,
CCorePreferenceConstants.SCALABILITY_SKIP_TRIVIAL_EXPRESSIONS,
CCorePreferenceConstants.SCALABILITY_MAXIMUM_TRIVIAL_EXPRESSIONS,
PreferencesMessages.ScalabilityPreferencePage_skipTrivialExpressions_label, 1, Integer.MAX_VALUE);
fMaximumTrivialExpressions.setPreferenceStore(CUIPlugin.getDefault().getCorePreferenceStore());
fMaximumTokens = createScalabilityIntegerField(group, CCorePreferenceConstants.SCALABILITY_LIMIT_TOKENS_PER_TU,
CCorePreferenceConstants.SCALABILITY_MAXIMUM_TOKENS,
PreferencesMessages.ScalabilityPreferencePage_maximumTokensPerTU_label, 1, 1000000000);
fMaximumTokens.setPreferenceStore(CUIPlugin.getDefault().getCorePreferenceStore());
}
private IntegerFieldEditor createIntegerField(Composite parent, String name, String labelText, int rangeMinimum,
int rangeMaximum) {
final IntegerFieldEditor integerField = new IntegerFieldEditor(name, labelText, parent);
GridData data = (GridData) integerField.getTextControl(parent).getLayoutData();
data.horizontalAlignment = GridData.BEGINNING;
data.widthHint = convertWidthInCharsToPixels(11);
integerField.setPage(this);
integerField.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
integerField.setValidRange(rangeMinimum, rangeMaximum);
integerField.setErrorMessage(NLS.bind(PreferencesMessages.ScalabilityPreferencePage_error,
new Object[] { rangeMinimum, rangeMaximum }));
integerField.load();
integerField.setPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID))
setValid(integerField.isValid());
}
});
return integerField;
}
private ScalabilityIntegerFieldEditor createScalabilityIntegerField(Composite parent, String enable, String name,
String labelText, int rangeMinimum, int rangeMaximum) {
final ScalabilityIntegerFieldEditor field = new ScalabilityIntegerFieldEditor(enable, name, labelText, parent);
GridData data = (GridData) field.getTextControl(parent).getLayoutData();
data.horizontalAlignment = GridData.BEGINNING;
data.widthHint = convertWidthInCharsToPixels(11);
field.setPage(this);
field.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
field.setValidRange(rangeMinimum, rangeMaximum);
field.setErrorMessage(NLS.bind(PreferencesMessages.ScalabilityPreferencePage_error,
new Object[] { rangeMinimum, rangeMaximum }));
field.load();
field.setPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID))
setValid(field.isValid());
}
});
return field;
}
private static void indent(Control control, GridData masterLayoutData) {
GridData gridData = new GridData();
gridData.horizontalIndent = masterLayoutData.horizontalIndent + 20;
control.setLayoutData(gridData);
}
private void createDependency(final Button master, String masterKey, final Control slave, boolean indent) {
if (indent) {
indent(slave, (GridData) master.getLayoutData());
}
boolean masterState = getPreferenceStore().getBoolean(masterKey);
slave.setEnabled(!masterState);
if (masterState) {
((Button) slave).setSelection(masterState);
}
SelectionListener listener = new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
slave.setEnabled(!master.getSelection());
if (master.getSelection()) {
((Button) slave).setSelection(master.getSelection());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
};
master.addSelectionListener(listener);
fMasterSlaveListeners.add(listener);
}
/*
* @see IWorkbenchPreferencePage#init(IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
}
/*
* @see IPreferencePage#performOk()
*/
@Override
public boolean performOk() {
IPreferenceStore prefs = getPreferenceStore();
Iterator<Object> iter = fCheckBoxes.keySet().iterator();
while (iter.hasNext()) {
Button b = (Button) iter.next();
String key = fCheckBoxes.get(b);
prefs.setValue(key, b.getSelection());
}
prefs.setValue(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES, fLinesToTrigger.getIntValue());
fMaximumTrivialExpressions.store();
fMaximumTokens.store();
return super.performOk();
}
/*
* @see PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
IPreferenceStore prefs = getPreferenceStore();
Iterator<Object> iter = fCheckBoxes.keySet().iterator();
while (iter.hasNext()) {
Button b = (Button) iter.next();
String key = fCheckBoxes.get(b);
b.setSelection(prefs.getDefaultBoolean(key));
}
// Update slaves
iter = fMasterSlaveListeners.iterator();
while (iter.hasNext()) {
SelectionListener listener = (SelectionListener) iter.next();
listener.widgetSelected(null);
}
fLinesToTrigger
.setStringValue(Integer.toString(prefs.getDefaultInt(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES)));
fMaximumTrivialExpressions.loadDefault();
fMaximumTokens.loadDefault();
}
}