X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fconsole%2FSCLConsolePreferencePage.java;fp=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fconsole%2FSCLConsolePreferencePage.java;h=3f1f3073d15df73e1c7e21d39ac14600da5b983d;hp=0000000000000000000000000000000000000000;hb=501ad95ad5ca980ef4c6e65af1451a0d7b63cddc;hpb=6a8b529bc5ceff5f1455968c03e65d140ffb6e39 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLConsolePreferencePage.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLConsolePreferencePage.java new file mode 100644 index 000000000..3f1f3073d --- /dev/null +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLConsolePreferencePage.java @@ -0,0 +1,188 @@ +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); + } + } + +}