]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLConsolePreferencePage.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / console / SCLConsolePreferencePage.java
1 package org.simantics.scl.ui.console;
2
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;
16
17 /**
18  * A page to set the preferences for the SCL console.
19  * 
20  * @author Tuukka Lehtonen
21  * @since 1.42.0
22  * @see SCLConsolePreferenceConstants 
23  */
24 public class SCLConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
25
26     /**
27      * A boolean field editor that provides access to this editors boolean button.
28      * 
29      * Copied from
30      * <code>org.eclipse.debug.internal.ui.preferences.BooleanFieldEditor2</code>.
31      */
32     public class BooleanFieldEditor2 extends BooleanFieldEditor {
33         private  Button fChangeControl;
34
35         public BooleanFieldEditor2(
36                 String name,
37                 String labelText,
38                 int style,
39                 Composite parent) {
40             super(name, labelText, style, parent);
41         }
42
43         @Override
44         public Button getChangeControl(Composite parent) {
45             if (fChangeControl == null) {
46                 fChangeControl = super.getChangeControl(parent);
47             }
48             return fChangeControl;
49         }
50     }
51
52     /**
53      * This class exists to provide visibility to the <code>refreshValidState</code>
54      * method and to perform more intelligent clearing of the error message.
55      */
56     protected class ConsoleIntegerFieldEditor extends IntegerFieldEditor {
57
58         public ConsoleIntegerFieldEditor(String name, String labelText, Composite parent) {
59             super(name, labelText, parent);
60         }
61
62         /**
63          * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
64          */
65         @Override
66         protected void refreshValidState() {
67             super.refreshValidState();
68         }
69
70         /**
71          * Clears the error message from the message line if the error
72          * message is the error message from this field editor.
73          */
74         @Override
75         protected void clearErrorMessage() {
76             if (canClearErrorMessage()) {
77                 super.clearErrorMessage();
78             }
79         }
80     }
81
82     private BooleanFieldEditor2 fUseBufferSize = null;
83     private ConsoleIntegerFieldEditor fBufferSizeEditor = null;
84
85     /**
86      * Create the console page.
87      */
88     public SCLConsolePreferencePage() {
89         super(GRID);
90         setDescription(Messages.SCLConsolePreferencePage_Description);
91         setPreferenceStore(Activator.getInstance().getPreferenceStore());
92     }
93
94     /**
95      * Create all field editors for this page
96      */
97     @Override
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);
101
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);
106
107         fUseBufferSize.getChangeControl(getFieldEditorParent()).addSelectionListener(
108                 SelectionListener.widgetSelectedAdapter(e -> updateBufferSizeEditor()));
109     }
110
111     /**
112      * @see IWorkbenchPreferencePage#init(IWorkbench)
113      */
114     @Override
115     public void init(IWorkbench workbench) {
116     }
117
118     /* (non-Javadoc)
119      * @see org.eclipse.jface.preference.IPreferencePage#performOk()
120      */
121     @Override
122     public boolean performOk() {
123         boolean ok = super.performOk();
124
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));
129
130         return ok;
131     }
132
133     /**
134      * @see org.eclipse.jface.preference.FieldEditorPreferencePage#initialize()
135      */
136     @Override
137     protected void initialize() {
138         super.initialize();
139         updateBufferSizeEditor();
140     }
141
142     /**
143      * Update enablement of buffer size editor based on enablement of 'limit
144      * console output' editor.
145      */
146     protected void updateBufferSizeEditor() {
147         Button b = fUseBufferSize.getChangeControl(getFieldEditorParent());
148         fBufferSizeEditor.getTextControl(getFieldEditorParent()).setEnabled(b.getSelection());
149         fBufferSizeEditor.getLabelControl(getFieldEditorParent()).setEnabled(b.getSelection());
150     }
151
152     /**
153      * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
154      */
155     @Override
156     protected void performDefaults() {
157         super.performDefaults();
158         updateBufferSizeEditor();
159     }
160
161     protected boolean canClearErrorMessage() {
162         return fBufferSizeEditor.isValid();
163     }
164
165     /**
166      * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
167      */
168     @Override
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.
174             if (newValue) {
175                 if (fBufferSizeEditor != null && event.getSource() != fBufferSizeEditor) {
176                     fBufferSizeEditor.refreshValidState();
177                 }
178                 checkState();
179             } else {
180                 super.propertyChange(event);
181             }
182
183         } else {
184             super.propertyChange(event);
185         }
186     }
187
188 }