package org.simantics.scl.ui.console;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.simantics.scl.ui.Activator;
/**
* A page to set the preferences for the SCL console.
*
* @author Tuukka Lehtonen
* @since 1.42.0
* @see SCLConsolePreferenceConstants
*/
public class SCLConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
/**
* A boolean field editor that provides access to this editors boolean button.
*
* Copied from
* org.eclipse.debug.internal.ui.preferences.BooleanFieldEditor2
.
*/
public class BooleanFieldEditor2 extends BooleanFieldEditor {
private Button fChangeControl;
public BooleanFieldEditor2(
String name,
String labelText,
int style,
Composite parent) {
super(name, labelText, style, parent);
}
@Override
public Button getChangeControl(Composite parent) {
if (fChangeControl == null) {
fChangeControl = super.getChangeControl(parent);
}
return fChangeControl;
}
}
/**
* This class exists to provide visibility to the refreshValidState
* method and to perform more intelligent clearing of the error message.
*/
protected class ConsoleIntegerFieldEditor extends IntegerFieldEditor {
public ConsoleIntegerFieldEditor(String name, String labelText, Composite parent) {
super(name, labelText, parent);
}
/**
* @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
*/
@Override
protected void refreshValidState() {
super.refreshValidState();
}
/**
* Clears the error message from the message line if the error
* message is the error message from this field editor.
*/
@Override
protected void clearErrorMessage() {
if (canClearErrorMessage()) {
super.clearErrorMessage();
}
}
}
private BooleanFieldEditor2 fUseBufferSize = null;
private ConsoleIntegerFieldEditor fBufferSizeEditor = null;
/**
* Create the console page.
*/
public SCLConsolePreferencePage() {
super(GRID);
setDescription(Messages.SCLConsolePreferencePage_Description);
setPreferenceStore(Activator.getInstance().getPreferenceStore());
}
/**
* Create all field editors for this page
*/
@Override
public void createFieldEditors() {
fUseBufferSize = new BooleanFieldEditor2(Preferences.CONSOLE_LIMIT_CONSOLE_OUTPUT, Messages.SCLConsolePreferencePage_Limit_console_output_Label, SWT.NONE, getFieldEditorParent());
addField(fUseBufferSize);
fBufferSizeEditor = new ConsoleIntegerFieldEditor(Preferences.CONSOLE_LOW_WATER_MARK, Messages.SCLConsolePreferencePage_Console_buffer_size_Label, getFieldEditorParent());
addField(fBufferSizeEditor);
fBufferSizeEditor.setValidRange(1000, 10000000);
fBufferSizeEditor.setErrorMessage(Messages.SCLConsolePreferencePage_Console_buffer_size_Error);
fUseBufferSize.getChangeControl(getFieldEditorParent()).addSelectionListener(
SelectionListener.widgetSelectedAdapter(e -> updateBufferSizeEditor()));
}
/**
* @see IWorkbenchPreferencePage#init(IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
@Override
public boolean performOk() {
boolean ok = super.performOk();
// update high water mark to be (about) 100 lines (100 * 80 chars) greater than low water mark
IPreferenceStore store = Activator.getInstance().getPreferenceStore();
int low = store.getInt(Preferences.CONSOLE_LOW_WATER_MARK);
store.setValue(Preferences.CONSOLE_HIGH_WATER_MARK, Preferences.highWatermarkForLow(low));
return ok;
}
/**
* @see org.eclipse.jface.preference.FieldEditorPreferencePage#initialize()
*/
@Override
protected void initialize() {
super.initialize();
updateBufferSizeEditor();
}
/**
* Update enablement of buffer size editor based on enablement of 'limit
* console output' editor.
*/
protected void updateBufferSizeEditor() {
Button b = fUseBufferSize.getChangeControl(getFieldEditorParent());
fBufferSizeEditor.getTextControl(getFieldEditorParent()).setEnabled(b.getSelection());
fBufferSizeEditor.getLabelControl(getFieldEditorParent()).setEnabled(b.getSelection());
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
super.performDefaults();
updateBufferSizeEditor();
}
protected boolean canClearErrorMessage() {
return fBufferSizeEditor.isValid();
}
/**
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID)) {
boolean newValue = ((Boolean) event.getNewValue()).booleanValue();
// If the new value is true then we must check all field editors.
// If it is false, then the page is invalid in any case.
if (newValue) {
if (fBufferSizeEditor != null && event.getSource() != fBufferSizeEditor) {
fBufferSizeEditor.refreshValidState();
}
checkState();
} else {
super.propertyChange(event);
}
} else {
super.propertyChange(event);
}
}
}