1 package org.simantics.scl.ui.console;
3 import org.eclipse.jface.preference.BooleanFieldEditor;
4 import org.eclipse.jface.preference.FieldEditor;
5 import org.eclipse.jface.preference.FieldEditorPreferencePage;
6 import org.eclipse.jface.preference.IPreferenceStore;
7 import org.eclipse.jface.preference.IntegerFieldEditor;
8 import org.eclipse.jface.util.PropertyChangeEvent;
9 import org.eclipse.swt.SWT;
10 import org.eclipse.swt.events.SelectionListener;
11 import org.eclipse.swt.widgets.Button;
12 import org.eclipse.swt.widgets.Composite;
13 import org.eclipse.ui.IWorkbench;
14 import org.eclipse.ui.IWorkbenchPreferencePage;
15 import org.simantics.scl.ui.Activator;
18 * A page to set the preferences for the SCL console.
20 * @author Tuukka Lehtonen
22 * @see SCLConsolePreferenceConstants
24 public class SCLConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
27 * A boolean field editor that provides access to this editors boolean button.
30 * <code>org.eclipse.debug.internal.ui.preferences.BooleanFieldEditor2</code>.
32 public class BooleanFieldEditor2 extends BooleanFieldEditor {
33 private Button fChangeControl;
35 public BooleanFieldEditor2(
40 super(name, labelText, style, parent);
44 public Button getChangeControl(Composite parent) {
45 if (fChangeControl == null) {
46 fChangeControl = super.getChangeControl(parent);
48 return fChangeControl;
53 * This class exists to provide visibility to the <code>refreshValidState</code>
54 * method and to perform more intelligent clearing of the error message.
56 protected class ConsoleIntegerFieldEditor extends IntegerFieldEditor {
58 public ConsoleIntegerFieldEditor(String name, String labelText, Composite parent) {
59 super(name, labelText, parent);
63 * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
66 protected void refreshValidState() {
67 super.refreshValidState();
71 * Clears the error message from the message line if the error
72 * message is the error message from this field editor.
75 protected void clearErrorMessage() {
76 if (canClearErrorMessage()) {
77 super.clearErrorMessage();
82 private BooleanFieldEditor2 fUseBufferSize = null;
83 private ConsoleIntegerFieldEditor fBufferSizeEditor = null;
86 * Create the console page.
88 public SCLConsolePreferencePage() {
90 setDescription(Messages.SCLConsolePreferencePage_Description);
91 setPreferenceStore(Activator.getInstance().getPreferenceStore());
95 * Create all field editors for this page
98 public void createFieldEditors() {
99 fUseBufferSize = new BooleanFieldEditor2(Preferences.CONSOLE_LIMIT_CONSOLE_OUTPUT, Messages.SCLConsolePreferencePage_Limit_console_output_Label, SWT.NONE, getFieldEditorParent());
100 addField(fUseBufferSize);
102 fBufferSizeEditor = new ConsoleIntegerFieldEditor(Preferences.CONSOLE_LOW_WATER_MARK, Messages.SCLConsolePreferencePage_Console_buffer_size_Label, getFieldEditorParent());
103 addField(fBufferSizeEditor);
104 fBufferSizeEditor.setValidRange(1000, 10000000);
105 fBufferSizeEditor.setErrorMessage(Messages.SCLConsolePreferencePage_Console_buffer_size_Error);
107 fUseBufferSize.getChangeControl(getFieldEditorParent()).addSelectionListener(
108 SelectionListener.widgetSelectedAdapter(e -> updateBufferSizeEditor()));
112 * @see IWorkbenchPreferencePage#init(IWorkbench)
115 public void init(IWorkbench workbench) {
119 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
122 public boolean performOk() {
123 boolean ok = super.performOk();
125 // update high water mark to be (about) 100 lines (100 * 80 chars) greater than low water mark
126 IPreferenceStore store = Activator.getInstance().getPreferenceStore();
127 int low = store.getInt(Preferences.CONSOLE_LOW_WATER_MARK);
128 store.setValue(Preferences.CONSOLE_HIGH_WATER_MARK, Preferences.highWatermarkForLow(low));
134 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#initialize()
137 protected void initialize() {
139 updateBufferSizeEditor();
143 * Update enablement of buffer size editor based on enablement of 'limit
144 * console output' editor.
146 protected void updateBufferSizeEditor() {
147 Button b = fUseBufferSize.getChangeControl(getFieldEditorParent());
148 fBufferSizeEditor.getTextControl(getFieldEditorParent()).setEnabled(b.getSelection());
149 fBufferSizeEditor.getLabelControl(getFieldEditorParent()).setEnabled(b.getSelection());
153 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
156 protected void performDefaults() {
157 super.performDefaults();
158 updateBufferSizeEditor();
161 protected boolean canClearErrorMessage() {
162 return fBufferSizeEditor.isValid();
166 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
169 public void propertyChange(PropertyChangeEvent event) {
170 if (event.getProperty().equals(FieldEditor.IS_VALID)) {
171 boolean newValue = ((Boolean) event.getNewValue()).booleanValue();
172 // If the new value is true then we must check all field editors.
173 // If it is false, then the page is invalid in any case.
175 if (fBufferSizeEditor != null && event.getSource() != fBufferSizeEditor) {
176 fBufferSizeEditor.refreshValidState();
180 super.propertyChange(event);
184 super.propertyChange(event);