Parcourir la source

Switch lots of things to use the new RunnableLoggingSwingWorker.

pull/380/head
Greg Holmes il y a 9 ans
Parent
révision
005f5c8a2f

+ 6
- 26
ui_swing/src/com/dmdirc/addons/ui_swing/components/FontPicker.java Voir le fichier

@@ -24,16 +24,13 @@ package com.dmdirc.addons.ui_swing.components;
24 24
 
25 25
 import com.dmdirc.DMDircMBassador;
26 26
 import com.dmdirc.addons.ui_swing.components.renderers.FontListCellRenderer;
27
-import com.dmdirc.events.UserErrorEvent;
28
-import com.dmdirc.logger.ErrorLevel;
29 27
 
30 28
 import java.awt.Font;
31 29
 import java.awt.GraphicsEnvironment;
32
-import java.util.concurrent.ExecutionException;
33 30
 
34 31
 import javax.swing.DefaultComboBoxModel;
35 32
 import javax.swing.JComboBox;
36
-import javax.swing.SwingUtilities;
33
+import javax.swing.MutableComboBoxModel;
37 34
 
38 35
 /**
39 36
  * System font picking component.
@@ -56,25 +53,9 @@ public class FontPicker extends JComboBox<Object> {
56 53
         this.fontFamily = fontFamily;
57 54
 
58 55
         setRenderer(new FontListCellRenderer(getRenderer()));
59
-        new LoggingSwingWorker<String[], String[]>(eventBus) {
60
-
61
-            @Override
62
-            protected String[] doInBackground() {
63
-                return GraphicsEnvironment.getLocalGraphicsEnvironment().
64
-                        getAvailableFontFamilyNames();
65
-            }
66
-
67
-            @Override
68
-            protected void done() {
69
-                try {
70
-                    loadFonts(get());
71
-                } catch (InterruptedException ex) {
72
-                    //Ignore
73
-                } catch (ExecutionException ex) {
74
-                    eventBus.publishAsync(new UserErrorEvent(ErrorLevel.MEDIUM, ex, ex.getMessage(), ""));
75
-                }
76
-            }
77
-        }.execute();
56
+        new RunnableLoggingSwingWorker<String[], String[]>(eventBus,
57
+                () -> GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(),
58
+                this::loadFonts).execute();
78 59
     }
79 60
 
80 61
     /**
@@ -85,10 +66,9 @@ public class FontPicker extends JComboBox<Object> {
85 66
     private void loadFonts(final String... fonts) {
86 67
         final int size = getFont().getSize();
87 68
         for (final String font : fonts) {
88
-            SwingUtilities.invokeLater(() -> ((DefaultComboBoxModel<Object>) getModel()).addElement(new Font(
89
-                    font, Font.PLAIN, size)));
69
+            ((MutableComboBoxModel<Object>) getModel()).addElement(new Font(font, Font.PLAIN, size));
90 70
         }
91
-        SwingUtilities.invokeLater(() -> setSelectedItem(new Font(fontFamily, Font.PLAIN, size)));
71
+        setSelectedItem(new Font(fontFamily, Font.PLAIN, size));
92 72
     }
93 73
 
94 74
 }

+ 119
- 6
ui_swing/src/com/dmdirc/addons/ui_swing/components/RunnableLoggingSwingWorker.java Voir le fichier

@@ -23,27 +23,140 @@
23 23
 package com.dmdirc.addons.ui_swing.components;
24 24
 
25 25
 import com.dmdirc.DMDircMBassador;
26
+import com.dmdirc.events.UserErrorEvent;
27
+import com.dmdirc.logger.ErrorLevel;
28
+
29
+import java.util.List;
30
+import java.util.concurrent.ExecutionException;
31
+import java.util.function.Consumer;
32
+import java.util.function.Supplier;
26 33
 
27 34
 /**
28 35
  * {@link LoggingSwingWorker} that runs a {@link Runnable}.
29 36
  */
30 37
 public class RunnableLoggingSwingWorker<T, V> extends LoggingSwingWorker<T, V> {
31 38
 
32
-    private final Runnable runnable;
39
+    private final DMDircMBassador eventBus;
40
+    private final Consumer<T> doneConsumer;
41
+    private final Consumer<List<V>> processConsumer;
42
+    private Supplier<T> backgroundSupplier;
43
+    private Runnable backgroundRunnable;
44
+
45
+    /**
46
+     * Creates a new logging swing worker.
47
+     *
48
+     * @param eventBus           Event bus to post errors to.
49
+     * @param backgroundSupplier The supplier to call as the background task, off the EDT.
50
+     */
51
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
52
+            final Supplier<T> backgroundSupplier) {
53
+        this(eventBus, backgroundSupplier, result -> {});
54
+    }
55
+
56
+    /**
57
+     * Creates a new logging swing worker.
58
+     *
59
+     * @param eventBus           Event bus to post errors to.
60
+     * @param backgroundRunnable The runnable to call as the background task, off the EDT.
61
+     */
62
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
63
+            final Runnable backgroundRunnable) {
64
+        this(eventBus, backgroundRunnable, result -> {});
65
+    }
66
+
67
+    /**
68
+     * Creates a new logging swing worker.
69
+     *
70
+     * @param eventBus           Event bus to post errors to.
71
+     * @param backgroundSupplier The supplier to call as the background task, off the EDT.
72
+     * @param doneConsumer       The consumer called when the background task is complete
73
+     */
74
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
75
+            final Supplier<T> backgroundSupplier,
76
+            final Consumer<T> doneConsumer) {
77
+        this(eventBus, backgroundSupplier, doneConsumer, chunks -> {});
78
+    }
79
+
80
+    /**
81
+     * Creates a new logging swing worker.
82
+     *
83
+     * @param eventBus           Event bus to post errors to.
84
+     * @param backgroundRunnable The runnable to call as the background task, off the EDT.
85
+     * @param doneConsumer       The consumer called when the background task is complete
86
+     */
87
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
88
+            final Runnable backgroundRunnable,
89
+            final Consumer<T> doneConsumer) {
90
+        this(eventBus, backgroundRunnable, doneConsumer, chunks -> {});
91
+    }
92
+
93
+    /**
94
+     * Creates a new logging swing worker.
95
+     *
96
+     * @param eventBus           Event bus to post errors to.
97
+     * @param backgroundSupplier The supplier to call as the background task, off the EDT.
98
+     * @param doneConsumer       The consumer called when the background task is complete
99
+     * @param processConsumer    The consumer called to process results of the background task
100
+     *                           as it progresses
101
+     */
102
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
103
+            final Supplier<T> backgroundSupplier,
104
+            final Consumer<T> doneConsumer,
105
+            final Consumer<List<V>> processConsumer) {
106
+        super(eventBus);
107
+        this.eventBus = eventBus;
108
+        this.backgroundSupplier = backgroundSupplier;
109
+        this.doneConsumer = doneConsumer;
110
+        this.processConsumer = processConsumer;
111
+    }
33 112
 
34 113
     /**
35 114
      * Creates a new logging swing worker.
36 115
      *
37
-     * @param eventBus Event bus to post errors to.
116
+     * @param eventBus           Event bus to post errors to.
117
+     * @param backgroundRunnable The runnable to call as the background task, off the EDT.
118
+     * @param doneConsumer       The consumer called when the background task is complete
119
+     * @param processConsumer    The consumer called to process results of the background task
120
+     *                           as it progresses
38 121
      */
39
-    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus, final Runnable runnable) {
122
+    public RunnableLoggingSwingWorker(final DMDircMBassador eventBus,
123
+            final Runnable backgroundRunnable,
124
+            final Consumer<T> doneConsumer,
125
+            final Consumer<List<V>> processConsumer) {
40 126
         super(eventBus);
41
-        this.runnable = runnable;
127
+        this.eventBus = eventBus;
128
+        this.backgroundRunnable = backgroundRunnable;
129
+        this.doneConsumer = doneConsumer;
130
+        this.processConsumer = processConsumer;
42 131
     }
43 132
 
44 133
     @Override
45 134
     protected T doInBackground() throws Exception {
46
-        runnable.run();
47
-        return null;
135
+        if (backgroundSupplier == null) {
136
+            backgroundRunnable.run();
137
+            return null;
138
+        } else {
139
+            return backgroundSupplier.get();
140
+        }
141
+    }
142
+
143
+    @Override
144
+    protected void process(final List<V> chunks) {
145
+        processConsumer.accept(chunks);
146
+    }
147
+
148
+    @Override
149
+    protected void done() {
150
+        try {
151
+            handleDone(get());
152
+        } catch (InterruptedException ex) {
153
+            //Ignore
154
+        } catch (ExecutionException ex) {
155
+            eventBus.publishAsync(new UserErrorEvent(ErrorLevel.MEDIUM, ex, ex.getMessage(), ""));
156
+        }
157
+    }
158
+
159
+    public void handleDone(final T value) {
160
+        doneConsumer.accept(value);
48 161
     }
49 162
 }

+ 12
- 24
ui_swing/src/com/dmdirc/addons/ui_swing/components/addonpanel/AddonPanel.java Voir le fichier

@@ -23,8 +23,7 @@
23 23
 package com.dmdirc.addons.ui_swing.components.addonpanel;
24 24
 
25 25
 import com.dmdirc.DMDircMBassador;
26
-import com.dmdirc.addons.ui_swing.UIUtilities;
27
-import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
26
+import com.dmdirc.addons.ui_swing.components.RunnableLoggingSwingWorker;
28 27
 import com.dmdirc.addons.ui_swing.components.addonbrowser.BrowserWindow;
29 28
 import com.dmdirc.addons.ui_swing.components.addonbrowser.DataLoaderWorkerFactory;
30 29
 import com.dmdirc.addons.ui_swing.components.text.TextLabel;
@@ -37,6 +36,7 @@ import javax.swing.JPanel;
37 36
 import javax.swing.JScrollPane;
38 37
 import javax.swing.JTable;
39 38
 import javax.swing.ListSelectionModel;
39
+import javax.swing.ScrollPaneConstants;
40 40
 import javax.swing.event.HyperlinkEvent;
41 41
 import javax.swing.event.HyperlinkEvent.EventType;
42 42
 import javax.swing.event.HyperlinkListener;
@@ -111,10 +111,8 @@ public abstract class AddonPanel extends JPanel implements AddonToggleListener,
111 111
 
112 112
         scrollPane = new JScrollPane(new JLabel("Loading " + getTypeName()
113 113
                 + "..."));
114
-        scrollPane.setHorizontalScrollBarPolicy(
115
-                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
116
-        scrollPane.setVerticalScrollBarPolicy(
117
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
114
+        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
115
+        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
118 116
 
119 117
         blurbLabel = new TextLabel(getTypeName().substring(0, 1).toUpperCase()
120 118
                 + getTypeName().substring(1) + " allow you to extend the "
@@ -130,24 +128,14 @@ public abstract class AddonPanel extends JPanel implements AddonToggleListener,
130 128
      * Populates the list in a background thread.
131 129
      */
132 130
     protected void load() {
133
-        new LoggingSwingWorker<Object, Object>(eventBus) {
134
-            @Override
135
-            protected Object doInBackground() {
136
-                return populateList(addonList);
137
-            }
138
-
139
-            @Override
140
-            protected void done() {
141
-                super.done();
142
-                scrollPane.setViewportView(addonList);
143
-                UIUtilities.invokeLater(() -> {
144
-                    addonList.getSelectionModel()
145
-                            .addListSelectionListener(AddonPanel.this);
146
-                    addonList.getSelectionModel()
147
-                            .setSelectionInterval(0, 0);
148
-                });
149
-            }
150
-        }.execute();
131
+        new RunnableLoggingSwingWorker<>(eventBus,
132
+                () -> populateList(addonList),
133
+                value -> {
134
+                    scrollPane.setViewportView(addonList);
135
+                    addonList.getSelectionModel().addListSelectionListener(this);
136
+                    addonList.getSelectionModel().setSelectionInterval(0, 0);
137
+                }
138
+        ).execute();
151 139
     }
152 140
 
153 141
     /** Lays out the dialog. */

+ 15
- 41
ui_swing/src/com/dmdirc/addons/ui_swing/components/inputfields/SwingInputHandler.java Voir le fichier

@@ -25,7 +25,7 @@ package com.dmdirc.addons.ui_swing.components.inputfields;
25 25
 import com.dmdirc.DMDircMBassador;
26 26
 import com.dmdirc.addons.ui_swing.Apple;
27 27
 import com.dmdirc.addons.ui_swing.UIUtilities;
28
-import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
28
+import com.dmdirc.addons.ui_swing.components.RunnableLoggingSwingWorker;
29 29
 import com.dmdirc.commandparser.parsers.CommandParser;
30 30
 import com.dmdirc.interfaces.CommandController;
31 31
 import com.dmdirc.interfaces.WindowModel;
@@ -35,6 +35,7 @@ import com.dmdirc.ui.input.InputHandler;
35 35
 import com.dmdirc.ui.input.TabCompleterUtils;
36 36
 
37 37
 import java.awt.event.ActionEvent;
38
+import java.awt.event.InputEvent;
38 39
 import java.awt.event.KeyEvent;
39 40
 import java.awt.event.KeyListener;
40 41
 
@@ -153,21 +154,11 @@ public class SwingInputHandler extends InputHandler implements KeyListener {
153 154
 
154 155
             @Override
155 156
             public void actionPerformed(final ActionEvent e) {
156
-                new LoggingSwingWorker<Object, Void>(eventBus) {
157
-
158
-                    @Override
159
-                    protected Object doInBackground() {
160
-                        localTarget.setEditable(false);
161
-                        doTabCompletion(false);
162
-                        return null;
163
-                    }
164
-
165
-                    @Override
166
-                    protected void done() {
167
-                        localTarget.setEditable(true);
168
-                        super.done();
169
-                    }
170
-                }.execute();
157
+                localTarget.setEditable(false);
158
+                new RunnableLoggingSwingWorker<>(eventBus,
159
+                        () -> doTabCompletion(false),
160
+                        value -> localTarget.setEditable(true)
161
+                ).execute();
171 162
             }
172 163
         });
173 164
         localTarget.getActionMap().put("insert-shift-tab",
@@ -177,28 +168,18 @@ public class SwingInputHandler extends InputHandler implements KeyListener {
177 168
 
178 169
                     @Override
179 170
                     public void actionPerformed(final ActionEvent e) {
180
-                        new LoggingSwingWorker<Object, Void>(eventBus) {
181
-
182
-                            @Override
183
-                            protected Object doInBackground() {
184
-                                localTarget.setEditable(false);
185
-                                doTabCompletion(true);
186
-                                return null;
187
-                            }
188
-
189
-                            @Override
190
-                            protected void done() {
191
-                                localTarget.setEditable(true);
192
-                                super.done();
193
-                            }
194
-                        }.execute();
171
+                        localTarget.setEditable(false);
172
+                        new RunnableLoggingSwingWorker<>(eventBus,
173
+                                () -> doTabCompletion(true),
174
+                                value -> localTarget.setEditable(true)
175
+                        ).execute();
195 176
                     }
196 177
                 });
197 178
         localTarget.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
198 179
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "insert-tab");
199 180
         localTarget.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
200
-                put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,
201
-                                KeyEvent.SHIFT_MASK), "insert-shift-tab");
181
+                put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK),
182
+                        "insert-shift-tab");
202 183
     }
203 184
 
204 185
     @Override
@@ -232,14 +213,7 @@ public class SwingInputHandler extends InputHandler implements KeyListener {
232 213
                                         "Event is not from known source.");
233 214
                     }
234 215
                     if (source.isEditable()) {
235
-                        new LoggingSwingWorker<Object, Void>(eventBus) {
236
-
237
-                            @Override
238
-                            protected Object doInBackground() {
239
-                                enterPressed(line);
240
-                                return null;
241
-                            }
242
-                        }.execute();
216
+                        new RunnableLoggingSwingWorker<>(eventBus, () -> enterPressed(line)).execute();
243 217
                     }
244 218
                 });
245 219
             }

+ 23
- 42
ui_swing/src/com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.java Voir le fichier

@@ -24,8 +24,9 @@ package com.dmdirc.addons.ui_swing.dialogs.prefs;
24 24
 
25 25
 import com.dmdirc.DMDircMBassador;
26 26
 import com.dmdirc.addons.ui_swing.UIUtilities;
27
+import com.dmdirc.addons.ui_swing.components.IconManager;
27 28
 import com.dmdirc.addons.ui_swing.components.ListScroller;
28
-import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
29
+import com.dmdirc.addons.ui_swing.components.RunnableLoggingSwingWorker;
29 30
 import com.dmdirc.addons.ui_swing.dialogs.StandardDialog;
30 31
 import com.dmdirc.addons.ui_swing.dialogs.updater.SwingRestartDialog;
31 32
 import com.dmdirc.addons.ui_swing.injection.DialogModule.ForSettings;
@@ -35,12 +36,10 @@ import com.dmdirc.config.prefs.PreferencesCategory;
35 36
 import com.dmdirc.config.prefs.PreferencesDialogModel;
36 37
 import com.dmdirc.events.UserErrorEvent;
37 38
 import com.dmdirc.logger.ErrorLevel;
38
-import com.dmdirc.addons.ui_swing.components.IconManager;
39 39
 
40 40
 import java.awt.Window;
41 41
 import java.awt.event.ActionEvent;
42 42
 import java.awt.event.ActionListener;
43
-import java.util.concurrent.ExecutionException;
44 43
 
45 44
 import javax.inject.Inject;
46 45
 import javax.inject.Provider;
@@ -51,6 +50,7 @@ import javax.swing.JList;
51 50
 import javax.swing.JScrollPane;
52 51
 import javax.swing.ListSelectionModel;
53 52
 import javax.swing.ScrollPaneConstants;
53
+import javax.swing.SwingWorker;
54 54
 import javax.swing.WindowConstants;
55 55
 import javax.swing.event.ListSelectionEvent;
56 56
 import javax.swing.event.ListSelectionListener;
@@ -74,7 +74,7 @@ public final class SwingPreferencesDialog extends StandardDialog implements
74 74
     /** Preferences Manager. */
75 75
     private PreferencesDialogModel manager;
76 76
     /** Manager loading swing worker. */
77
-    private final LoggingSwingWorker<PreferencesDialogModel, Void> worker;
77
+    private final SwingWorker<PreferencesDialogModel, Void> worker;
78 78
     /** The provider to use for restart dialogs. */
79 79
     private final DialogProvider<SwingRestartDialog> restartDialogProvider;
80 80
     /** The provider to use to produce a category panel. */
@@ -111,38 +111,23 @@ public final class SwingPreferencesDialog extends StandardDialog implements
111 111
 
112 112
         initComponents();
113 113
 
114
-        worker = new LoggingSwingWorker<PreferencesDialogModel, Void>(eventBus) {
115
-
116
-            @Override
117
-            protected PreferencesDialogModel doInBackground() {
118
-                mainPanel.setWaiting(true);
119
-                PreferencesDialogModel prefsManager = null;
120
-                try {
121
-                    prefsManager = dialogModelProvider.get();
122
-                } catch (IllegalArgumentException ex) {
123
-                    mainPanel.setError(ex.getMessage());
124
-                    eventBus.publishAsync(new UserErrorEvent(ErrorLevel.HIGH, ex,
125
-                            "Unable to load the preferences dialog", ""));
126
-                }
127
-                return prefsManager;
114
+        worker = new RunnableLoggingSwingWorker<>(eventBus, () -> {
115
+            mainPanel.setWaiting(true);
116
+            PreferencesDialogModel prefsManager = null;
117
+            try {
118
+                prefsManager = dialogModelProvider.get();
119
+            } catch (IllegalArgumentException ex) {
120
+                mainPanel.setError(ex.getMessage());
121
+                eventBus.publishAsync(new UserErrorEvent(ErrorLevel.HIGH, ex,
122
+                        "Unable to load the preferences dialog", ""));
128 123
             }
129
-
130
-            @Override
131
-            protected void done() {
132
-                if (!isCancelled()) {
133
-                    try {
134
-                        final PreferencesDialogModel prefsManager = get();
135
-                        if (prefsManager != null) {
136
-                            setPrefsManager(prefsManager);
137
-                        }
138
-                    } catch (InterruptedException ex) {
139
-                        //Ignore
140
-                    } catch (ExecutionException ex) {
141
-                        eventBus.publishAsync(new UserErrorEvent(ErrorLevel.MEDIUM, ex, ex.getMessage(), ""));
124
+            return prefsManager;
125
+        },
126
+                value -> {
127
+                    if (value != null) {
128
+                        setPrefsManager(value);
142 129
                     }
143
-                }
144
-            }
145
-        };
130
+        });
146 131
         worker.execute();
147 132
     }
148 133
 
@@ -242,15 +227,11 @@ public final class SwingPreferencesDialog extends StandardDialog implements
242 227
             saveOptions();
243 228
         }
244 229
 
245
-        new LoggingSwingWorker<Void, Void>(eventBus) {
246
-            @Override
247
-            protected Void doInBackground() {
248
-                if (manager != null) {
249
-                    manager.dismiss();
250
-                }
251
-                return null;
230
+        new RunnableLoggingSwingWorker<>(eventBus, () -> {
231
+            if (manager != null) {
232
+                manager.dismiss();
252 233
             }
253
-        }.execute();
234
+        }).execute();
254 235
         dispose();
255 236
     }
256 237
 

+ 5
- 11
ui_swing/src/com/dmdirc/addons/ui_swing/dialogs/updater/SwingUpdaterDialog.java Voir le fichier

@@ -24,8 +24,8 @@ package com.dmdirc.addons.ui_swing.dialogs.updater;
24 24
 
25 25
 import com.dmdirc.DMDircMBassador;
26 26
 import com.dmdirc.addons.ui_swing.UIUtilities;
27
-import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
28 27
 import com.dmdirc.addons.ui_swing.components.PackingTable;
28
+import com.dmdirc.addons.ui_swing.components.RunnableLoggingSwingWorker;
29 29
 import com.dmdirc.addons.ui_swing.components.text.TextLabel;
30 30
 import com.dmdirc.addons.ui_swing.dialogs.StandardDialog;
31 31
 import com.dmdirc.addons.ui_swing.injection.DialogModule.ForUpdates;
@@ -182,16 +182,10 @@ public class SwingUpdaterDialog extends StandardDialog implements
182 182
 
183 183
             header.setText("DMDirc is updating the following components:");
184 184
 
185
-            new LoggingSwingWorker<Void, Void>(eventBus) {
186
-
187
-                @Override
188
-                protected Void doInBackground() {
189
-                    ((UpdateTableModel) table.getModel()).getUpdates().stream()
190
-                            .filter(((UpdateTableModel) table.getModel())::isEnabled)
191
-                            .forEach(updateManager::install);
192
-                    return null;
193
-                }
194
-            }.execute();
185
+            new RunnableLoggingSwingWorker<>(eventBus,
186
+                    () -> ((UpdateTableModel) table.getModel()).getUpdates().stream()
187
+                    .filter(((UpdateTableModel) table.getModel())::isEnabled)
188
+                    .forEach(updateManager::install)).execute();
195 189
 
196 190
             if (updateManager.getManagerStatus() == UpdateManagerStatus.IDLE_RESTART_NEEDED) {
197 191
                 restartDialogProvider.displayOrRequestFocus();

Chargement…
Annuler
Enregistrer