1 /*
2  * This file is part of Arduino.
3  *
4  * Copyright 2015 Arduino LLC (http://www.arduino.cc/)
5  *
6  * Arduino is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  */
29 
30 package cc.arduino.view.preferences;
31 
32 import cc.arduino.Constants;
33 import cc.arduino.i18n.Language;
34 import cc.arduino.i18n.Languages;
35 import processing.app.Base;
36 import processing.app.BaseNoGui;
37 import processing.app.I18n;
38 import processing.app.PreferencesData;
39 import processing.app.Theme;
40 import processing.app.helpers.FileUtils;
41 import processing.app.legacy.PApplet;
42 
43 import javax.swing.*;
44 import java.awt.*;
45 import java.awt.event.WindowEvent;
46 import java.io.File;
47 import java.util.LinkedList;
48 
49 import static processing.app.I18n.tr;
50 
51 public class Preferences extends javax.swing.JDialog {
52 
53   private final WarningItem[] warningItems;
54   private final Base base;
55 
56   private static class WarningItem {
57     private final String value;
58     private final String translation;
59 
WarningItem(String value, String translation)60     public WarningItem(String value, String translation) {
61       this.value = value;
62       this.translation = translation;
63     }
64 
getValue()65     public String getValue() {
66       return value;
67     }
68 
69     @Override
toString()70     public String toString() {
71       return translation;
72     }
73   }
74 
Preferences(Window parent, Base base)75   public Preferences(Window parent, Base base) {
76     super(parent);
77     this.base = base;
78 
79     this.warningItems = new WarningItem[]{
80       new WarningItem("none", tr("None")),
81       new WarningItem("default", tr("Default")),
82       new WarningItem("more", tr("More")),
83       new WarningItem("all", tr("All"))
84     };
85 
86     initComponents();
87 
88     Base.registerWindowCloseKeys(getRootPane(), this::cancelButtonActionPerformed);
89 
90     showPrerefencesData();
91   }
92 
93   /**
94    * This method is called from within the constructor to initialize the form.
95    * WARNING: Do NOT modify this code. The content of this method is always
96    * regenerated by the Form Editor.
97    */
98   @SuppressWarnings("unchecked")
99   // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
initComponents()100   private void initComponents() {
101 
102     proxyTypeButtonGroup = new javax.swing.ButtonGroup();
103     manualProxyTypeButtonGroup = new javax.swing.ButtonGroup();
104     javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
105     javax.swing.JTabbedPane jTabbedPane1 = new javax.swing.JTabbedPane();
106     jPanel1 = new javax.swing.JPanel();
107     sketchbookLocationLabel = new javax.swing.JLabel();
108     sketchbookLocationField = new javax.swing.JTextField();
109     browseButton = new javax.swing.JButton();
110     comboLanguageLabel = new javax.swing.JLabel();
111     comboLanguage = new JComboBox(Languages.languages);
112     requiresRestartLabel = new javax.swing.JLabel();
113     fontSizeLabel = new javax.swing.JLabel();
114     fontSizeField = new javax.swing.JTextField();
115     showVerboseLabel = new javax.swing.JLabel();
116     verboseCompilationBox = new javax.swing.JCheckBox();
117     verboseUploadBox = new javax.swing.JCheckBox();
118     comboWarningsLabel = new javax.swing.JLabel();
119     comboWarnings = new JComboBox(warningItems);
120     additionalBoardsManagerLabel = new javax.swing.JLabel();
121     additionalBoardsManagerField = new javax.swing.JTextField();
122     extendedAdditionalUrlFieldWindow = new javax.swing.JButton();
123     morePreferencesLabel = new javax.swing.JLabel();
124     preferencesFileLabel = new javax.swing.JLabel();
125     arduinoNotRunningLabel = new javax.swing.JLabel();
126     checkboxesContainer = new javax.swing.JPanel();
127     displayLineNumbersBox = new javax.swing.JCheckBox();
128     enableCodeFoldingBox = new javax.swing.JCheckBox();
129     verifyUploadBox = new javax.swing.JCheckBox();
130     externalEditorBox = new javax.swing.JCheckBox();
131     cacheCompiledCore = new javax.swing.JCheckBox();
132     checkUpdatesBox = new javax.swing.JCheckBox();
133     updateExtensionBox = new javax.swing.JCheckBox();
134     saveVerifyUploadBox = new javax.swing.JCheckBox();
135     jLabel1 = new javax.swing.JLabel();
136     jLabel2 = new javax.swing.JLabel();
137     scaleSpinner = new javax.swing.JSpinner();
138     autoScaleCheckBox = new javax.swing.JCheckBox();
139     jLabel3 = new javax.swing.JLabel();
140     javax.swing.JPanel jPanel4 = new javax.swing.JPanel();
141     noProxy = new javax.swing.JRadioButton();
142     autoProxy = new javax.swing.JRadioButton();
143     manualProxy = new javax.swing.JRadioButton();
144     autoProxyUsePAC = new javax.swing.JCheckBox();
145     autoProxyPACURL = new javax.swing.JTextField();
146     manualProxyHTTP = new javax.swing.JRadioButton();
147     manualProxySOCKS = new javax.swing.JRadioButton();
148     manualProxyHostNameLabel = new javax.swing.JLabel();
149     manualProxyPortLabel = new javax.swing.JLabel();
150     manualProxyHostName = new javax.swing.JTextField();
151     manualProxyPort = new javax.swing.JTextField();
152     manualProxyUsernameLabel = new javax.swing.JLabel();
153     manualProxyUsername = new javax.swing.JTextField();
154     manualProxyPasswordLabel = new javax.swing.JLabel();
155     manualProxyPassword = new javax.swing.JPasswordField();
156     autoProxyUsernameLabel = new javax.swing.JLabel();
157     autoProxyUsername = new javax.swing.JTextField();
158     autoProxyPassword = new javax.swing.JPasswordField();
159     autoProxyPasswordLabel = new javax.swing.JLabel();
160     javax.swing.JPanel jPanel3 = new javax.swing.JPanel();
161     javax.swing.JButton okButton = new javax.swing.JButton();
162     javax.swing.JButton cancelButton = new javax.swing.JButton();
163 
164     setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
165     setTitle(tr("Preferences"));
166     setModal(true);
167     setResizable(false);
168 
169     jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS));
170 
171     jTabbedPane1.setFocusable(false);
172     jTabbedPane1.setRequestFocusEnabled(false);
173 
174     sketchbookLocationLabel.setText(tr("Sketchbook location:"));
175 
176     sketchbookLocationField.setColumns(40);
177 
178     browseButton.setText(I18n.PROMPT_BROWSE);
179     browseButton.addActionListener(new java.awt.event.ActionListener() {
180       public void actionPerformed(java.awt.event.ActionEvent evt) {
181         browseButtonActionPerformed(evt);
182       }
183     });
184 
185     comboLanguageLabel.setText(tr("Editor language: "));
186 
187     requiresRestartLabel.setText(tr("  (requires restart of Arduino)"));
188 
189     fontSizeLabel.setText(tr("Editor font size: "));
190 
191     fontSizeField.setColumns(4);
192 
193     showVerboseLabel.setText(tr("Show verbose output during: "));
194 
195     verboseCompilationBox.setText(tr("compilation "));
196 
197     verboseUploadBox.setText(tr("upload"));
198 
199     comboWarningsLabel.setText(tr("Compiler warnings: "));
200 
201     additionalBoardsManagerLabel.setText(tr("Additional Boards Manager URLs: "));
202     additionalBoardsManagerLabel.setToolTipText(tr("Enter a comma separated list of urls"));
203 
204     additionalBoardsManagerField.setToolTipText(tr("Enter a comma separated list of urls"));
205 
206     extendedAdditionalUrlFieldWindow.setIcon(new ImageIcon(Theme.getThemeImage("newwindow", this, Theme.scale(16), Theme.scale(14))));
207     extendedAdditionalUrlFieldWindow.setMargin(new java.awt.Insets(1, 1, 1, 1));
208     extendedAdditionalUrlFieldWindow.addActionListener(new java.awt.event.ActionListener() {
209       public void actionPerformed(java.awt.event.ActionEvent evt) {
210         extendedAdditionalUrlFieldWindowActionPerformed(evt);
211       }
212     });
213 
214     morePreferencesLabel.setForeground(Color.GRAY);
215     morePreferencesLabel.setText(tr("More preferences can be edited directly in the file"));
216 
217     preferencesFileLabel.setText(PreferencesData.getPreferencesFile().getAbsolutePath());
218     preferencesFileLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
219     preferencesFileLabel.addMouseListener(new java.awt.event.MouseAdapter() {
220       public void mousePressed(java.awt.event.MouseEvent evt) {
221         preferencesFileLabelMousePressed(evt);
222       }
223       public void mouseExited(java.awt.event.MouseEvent evt) {
224         preferencesFileLabelMouseExited(evt);
225       }
226       public void mouseEntered(java.awt.event.MouseEvent evt) {
227         preferencesFileLabelMouseEntered(evt);
228       }
229     });
230 
231     arduinoNotRunningLabel.setForeground(Color.GRAY);
232     arduinoNotRunningLabel.setText(tr("(edit only when Arduino is not running)"));
233 
234     checkboxesContainer.setLayout(new javax.swing.BoxLayout(checkboxesContainer, javax.swing.BoxLayout.Y_AXIS));
235 
236     displayLineNumbersBox.setText(tr("Display line numbers"));
237     checkboxesContainer.add(displayLineNumbersBox);
238 
239     enableCodeFoldingBox.setText(tr("Enable Code Folding"));
240     checkboxesContainer.add(enableCodeFoldingBox);
241 
242     verifyUploadBox.setText(tr("Verify code after upload"));
243     checkboxesContainer.add(verifyUploadBox);
244 
245     externalEditorBox.setText(tr("Use external editor"));
246     checkboxesContainer.add(externalEditorBox);
247 
248     cacheCompiledCore.setText(tr("Aggressively cache compiled core"));
249     checkboxesContainer.add(cacheCompiledCore);
250 
251     checkUpdatesBox.setText(tr("Check for updates on startup"));
252     checkboxesContainer.add(checkUpdatesBox);
253 
254     updateExtensionBox.setText(tr("Update sketch files to new extension on save (.pde -> .ino)"));
255     checkboxesContainer.add(updateExtensionBox);
256 
257     saveVerifyUploadBox.setText(tr("Save when verifying or uploading"));
258     checkboxesContainer.add(saveVerifyUploadBox);
259 
260     jLabel1.setText(tr("Interface scale:"));
261 
262     jLabel2.setText(tr("  (requires restart of Arduino)"));
263 
264     scaleSpinner.setModel(new javax.swing.SpinnerNumberModel(100, 100, 400, 5));
265     scaleSpinner.setEnabled(false);
266 
267     autoScaleCheckBox.setSelected(true);
268     autoScaleCheckBox.setText(tr("Automatic"));
269     autoScaleCheckBox.addItemListener(new java.awt.event.ItemListener() {
270       public void itemStateChanged(java.awt.event.ItemEvent evt) {
271         autoScaleCheckBoxItemStateChanged(evt);
272       }
273     });
274 
275     jLabel3.setText("%");
276 
277     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
278     jPanel1.setLayout(jPanel1Layout);
279     jPanel1Layout.setHorizontalGroup(
280       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
281       .addGroup(jPanel1Layout.createSequentialGroup()
282         .addContainerGap()
283         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
284           .addGroup(jPanel1Layout.createSequentialGroup()
285             .addComponent(sketchbookLocationField, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE)
286             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
287             .addComponent(browseButton))
288           .addComponent(checkboxesContainer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
289           .addGroup(jPanel1Layout.createSequentialGroup()
290             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
291               .addGroup(jPanel1Layout.createSequentialGroup()
292                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293                   .addComponent(jLabel1)
294                   .addComponent(comboWarningsLabel))
295                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
296                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297                   .addComponent(comboWarnings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
298                   .addGroup(jPanel1Layout.createSequentialGroup()
299                     .addComponent(autoScaleCheckBox)
300                     .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
301                     .addComponent(scaleSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
302                     .addGap(0, 0, 0)
303                     .addComponent(jLabel3)
304                     .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
305                     .addComponent(jLabel2))))
306               .addGroup(jPanel1Layout.createSequentialGroup()
307                 .addComponent(showVerboseLabel)
308                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
309                 .addComponent(verboseCompilationBox)
310                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
311                 .addComponent(verboseUploadBox))
312               .addGroup(jPanel1Layout.createSequentialGroup()
313                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
314                   .addComponent(comboLanguageLabel)
315                   .addComponent(fontSizeLabel))
316                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
317                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
318                   .addComponent(fontSizeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
319                   .addGroup(jPanel1Layout.createSequentialGroup()
320                     .addComponent(comboLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
321                     .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
322                     .addComponent(requiresRestartLabel))))
323               .addComponent(arduinoNotRunningLabel)
324               .addComponent(morePreferencesLabel)
325               .addComponent(preferencesFileLabel)
326               .addComponent(sketchbookLocationLabel)
327               .addGroup(jPanel1Layout.createSequentialGroup()
328                 .addComponent(additionalBoardsManagerLabel)
329                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
330                 .addComponent(additionalBoardsManagerField, javax.swing.GroupLayout.PREFERRED_SIZE, 500, javax.swing.GroupLayout.PREFERRED_SIZE)
331                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
332                 .addComponent(extendedAdditionalUrlFieldWindow)))
333             .addGap(0, 0, Short.MAX_VALUE)))
334         .addContainerGap())
335     );
336 
337     jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {comboLanguageLabel, comboWarningsLabel, fontSizeLabel, jLabel1, showVerboseLabel});
338 
339     jPanel1Layout.setVerticalGroup(
340       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
341       .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
342         .addContainerGap()
343         .addComponent(sketchbookLocationLabel)
344         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
345         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
346           .addComponent(sketchbookLocationField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
347           .addComponent(browseButton))
348         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
349         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
350           .addComponent(comboLanguageLabel)
351           .addComponent(comboLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
352           .addComponent(requiresRestartLabel))
353         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
354         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
355           .addComponent(fontSizeLabel)
356           .addComponent(fontSizeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
357         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
358         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
359           .addComponent(jLabel1)
360           .addComponent(jLabel2)
361           .addComponent(scaleSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
362           .addComponent(autoScaleCheckBox)
363           .addComponent(jLabel3))
364         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
365         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
366           .addComponent(showVerboseLabel)
367           .addComponent(verboseCompilationBox)
368           .addComponent(verboseUploadBox))
369         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
370         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
371           .addComponent(comboWarningsLabel)
372           .addComponent(comboWarnings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
373         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
374         .addComponent(checkboxesContainer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
375         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
376         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
377           .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
378             .addComponent(additionalBoardsManagerLabel)
379             .addComponent(additionalBoardsManagerField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
380           .addComponent(extendedAdditionalUrlFieldWindow))
381         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
382         .addComponent(morePreferencesLabel)
383         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
384         .addComponent(preferencesFileLabel)
385         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
386         .addComponent(arduinoNotRunningLabel)
387         .addContainerGap())
388     );
389 
390     jTabbedPane1.addTab(tr("Settings"), jPanel1);
391 
392     proxyTypeButtonGroup.add(noProxy);
393     noProxy.setText(tr("No proxy"));
394     noProxy.setActionCommand(Constants.PROXY_TYPE_NONE);
395 
396     proxyTypeButtonGroup.add(autoProxy);
397     autoProxy.setText(tr("Auto-detect proxy settings"));
398     autoProxy.setActionCommand(Constants.PROXY_TYPE_AUTO);
399     autoProxy.addItemListener(new java.awt.event.ItemListener() {
400       public void itemStateChanged(java.awt.event.ItemEvent evt) {
401         autoProxyItemStateChanged(evt);
402       }
403     });
404 
405     proxyTypeButtonGroup.add(manualProxy);
406     manualProxy.setText(tr("Manual proxy configuration"));
407     manualProxy.setActionCommand(Constants.PROXY_TYPE_MANUAL);
408     manualProxy.addItemListener(new java.awt.event.ItemListener() {
409       public void itemStateChanged(java.awt.event.ItemEvent evt) {
410         manualProxyItemStateChanged(evt);
411       }
412     });
413 
414     autoProxyUsePAC.setText(tr("Automatic proxy configuration URL:"));
415     autoProxyUsePAC.addItemListener(new java.awt.event.ItemListener() {
416       public void itemStateChanged(java.awt.event.ItemEvent evt) {
417         autoProxyUsePACItemStateChanged(evt);
418       }
419     });
420 
421     manualProxyTypeButtonGroup.add(manualProxyHTTP);
422     manualProxyHTTP.setText("HTTP");
423     manualProxyHTTP.setActionCommand(Constants.PROXY_MANUAL_TYPE_HTTP);
424 
425     manualProxyTypeButtonGroup.add(manualProxySOCKS);
426     manualProxySOCKS.setText("SOCKS");
427     manualProxySOCKS.setActionCommand(Constants.PROXY_MANUAL_TYPE_SOCKS);
428 
429     manualProxyHostNameLabel.setText(tr("Host name:"));
430 
431     manualProxyPortLabel.setText(tr("Port number:"));
432 
433     manualProxyUsernameLabel.setText(tr("Username:"));
434 
435     manualProxyPasswordLabel.setText(tr("Password:"));
436 
437     manualProxyPassword.setToolTipText("");
438 
439     autoProxyUsernameLabel.setText(tr("Username:"));
440 
441     autoProxyPassword.setToolTipText("");
442 
443     autoProxyPasswordLabel.setText(tr("Password:"));
444 
445     javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
446     jPanel4.setLayout(jPanel4Layout);
447     jPanel4Layout.setHorizontalGroup(
448       jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
449       .addGroup(jPanel4Layout.createSequentialGroup()
450         .addContainerGap()
451         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
452           .addGroup(jPanel4Layout.createSequentialGroup()
453             .addGap(12, 12, 12)
454             .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
455               .addComponent(autoProxyUsePAC)
456               .addGroup(jPanel4Layout.createSequentialGroup()
457                 .addGap(12, 12, 12)
458                 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
459                   .addComponent(autoProxyUsernameLabel)
460                   .addComponent(autoProxyPasswordLabel))))
461             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
462             .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
463               .addComponent(autoProxyPACURL)
464               .addGroup(jPanel4Layout.createSequentialGroup()
465                 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
466                   .addComponent(autoProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
467                   .addComponent(autoProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE))
468                 .addGap(0, 0, Short.MAX_VALUE))))
469           .addGroup(jPanel4Layout.createSequentialGroup()
470             .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
471               .addComponent(noProxy)
472               .addComponent(autoProxy)
473               .addComponent(manualProxy)
474               .addGroup(jPanel4Layout.createSequentialGroup()
475                 .addGap(12, 12, 12)
476                 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
477                   .addGroup(jPanel4Layout.createSequentialGroup()
478                     .addComponent(manualProxyHTTP)
479                     .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
480                     .addComponent(manualProxySOCKS))
481                   .addGroup(jPanel4Layout.createSequentialGroup()
482                     .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
483                       .addComponent(manualProxyHostNameLabel)
484                       .addComponent(manualProxyPortLabel)
485                       .addComponent(manualProxyUsernameLabel)
486                       .addComponent(manualProxyPasswordLabel))
487                     .addGap(18, 18, 18)
488                     .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
489                       .addComponent(manualProxyHostName, javax.swing.GroupLayout.PREFERRED_SIZE, 541, javax.swing.GroupLayout.PREFERRED_SIZE)
490                       .addComponent(manualProxyPort, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
491                       .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
492                         .addComponent(manualProxyPassword, javax.swing.GroupLayout.Alignment.LEADING)
493                         .addComponent(manualProxyUsername, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)))))))
494             .addGap(0, 0, Short.MAX_VALUE)))
495         .addContainerGap())
496     );
497     jPanel4Layout.setVerticalGroup(
498       jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
499       .addGroup(jPanel4Layout.createSequentialGroup()
500         .addContainerGap()
501         .addComponent(noProxy)
502         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
503         .addComponent(autoProxy)
504         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
505         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
506           .addComponent(autoProxyUsePAC)
507           .addComponent(autoProxyPACURL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
508         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
509         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
510           .addComponent(autoProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
511           .addComponent(autoProxyUsernameLabel))
512         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
513         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
514           .addComponent(autoProxyPasswordLabel)
515           .addComponent(autoProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
516         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
517         .addComponent(manualProxy)
518         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
519         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
520           .addComponent(manualProxyHTTP)
521           .addComponent(manualProxySOCKS))
522         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
523         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
524           .addComponent(manualProxyHostNameLabel)
525           .addComponent(manualProxyHostName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
526         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
527         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
528           .addComponent(manualProxyPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
529           .addComponent(manualProxyPortLabel))
530         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
531         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
532           .addComponent(manualProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
533           .addComponent(manualProxyUsernameLabel))
534         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
535         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
536           .addComponent(manualProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
537           .addComponent(manualProxyPasswordLabel))
538         .addContainerGap(190, Short.MAX_VALUE))
539     );
540 
541     jTabbedPane1.addTab(tr("Network"), jPanel4);
542 
543     jPanel2.add(jTabbedPane1);
544 
545     okButton.setText(I18n.PROMPT_OK);
546     okButton.addActionListener(new java.awt.event.ActionListener() {
547       public void actionPerformed(java.awt.event.ActionEvent evt) {
548         okButtonActionPerformed(evt);
549       }
550     });
551 
552     cancelButton.setText(I18n.PROMPT_CANCEL);
553     cancelButton.addActionListener(new java.awt.event.ActionListener() {
554       public void actionPerformed(java.awt.event.ActionEvent evt) {
555         cancelButtonActionPerformed(evt);
556       }
557     });
558 
559     javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
560     jPanel3.setLayout(jPanel3Layout);
561     jPanel3Layout.setHorizontalGroup(
562       jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
563       .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
564         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
565         .addComponent(okButton)
566         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
567         .addComponent(cancelButton)
568         .addContainerGap())
569     );
570     jPanel3Layout.setVerticalGroup(
571       jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
572       .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
573         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
574         .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
575           .addComponent(okButton)
576           .addComponent(cancelButton))
577         .addContainerGap())
578     );
579 
580     jPanel2.add(jPanel3);
581 
582     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
583     getContentPane().setLayout(layout);
584     layout.setHorizontalGroup(
585       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
586       .addGap(0, 691, Short.MAX_VALUE)
587       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
588         .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
589     );
590     layout.setVerticalGroup(
591       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
592       .addGap(0, 637, Short.MAX_VALUE)
593       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
594         .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
595     );
596 
597     pack();
598   }// </editor-fold>//GEN-END:initComponents
599 
cancelButtonActionPerformed(java.awt.event.ActionEvent evt)600   private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
601     dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
602   }//GEN-LAST:event_cancelButtonActionPerformed
603 
okButtonActionPerformed(java.awt.event.ActionEvent evt)604   private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
605     java.util.List<String> errors = validateData();
606     if (!errors.isEmpty()) {
607       Base.showWarning(tr("Error"), errors.get(0), null);
608       return;
609     }
610 
611     savePreferencesData();
612     base.getEditors().forEach(processing.app.Editor::applyPreferences);
613     cancelButtonActionPerformed(evt);
614   }//GEN-LAST:event_okButtonActionPerformed
615 
autoProxyItemStateChanged(java.awt.event.ItemEvent evt)616   private void autoProxyItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_autoProxyItemStateChanged
617     disableAllProxyFields();
618     autoProxyFieldsSetEnabled(autoProxy.isSelected());
619   }//GEN-LAST:event_autoProxyItemStateChanged
620 
manualProxyItemStateChanged(java.awt.event.ItemEvent evt)621   private void manualProxyItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_manualProxyItemStateChanged
622     disableAllProxyFields();
623     manualProxyFieldsSetEnabled(manualProxy.isSelected());
624   }//GEN-LAST:event_manualProxyItemStateChanged
625 
autoProxyUsePACItemStateChanged(java.awt.event.ItemEvent evt)626   private void autoProxyUsePACItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_autoProxyUsePACItemStateChanged
627     autoProxyPACFieldsSetEnabled(autoProxyUsePAC.isSelected());
628   }//GEN-LAST:event_autoProxyUsePACItemStateChanged
629 
preferencesFileLabelMouseEntered(java.awt.event.MouseEvent evt)630   private void preferencesFileLabelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMouseEntered
631     preferencesFileLabel.setForeground(new Color(0, 0, 140));
632   }//GEN-LAST:event_preferencesFileLabelMouseEntered
633 
preferencesFileLabelMouseExited(java.awt.event.MouseEvent evt)634   private void preferencesFileLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMouseExited
635     preferencesFileLabel.setForeground(new Color(76, 76, 76));
636   }//GEN-LAST:event_preferencesFileLabelMouseExited
637 
preferencesFileLabelMousePressed(java.awt.event.MouseEvent evt)638   private void preferencesFileLabelMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMousePressed
639     Base.openFolder(PreferencesData.getPreferencesFile().getParentFile());
640   }//GEN-LAST:event_preferencesFileLabelMousePressed
641 
extendedAdditionalUrlFieldWindowActionPerformed(java.awt.event.ActionEvent evt)642   private void extendedAdditionalUrlFieldWindowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extendedAdditionalUrlFieldWindowActionPerformed
643     final AdditionalBoardsManagerURLTextArea additionalBoardsManagerURLTextArea = new AdditionalBoardsManagerURLTextArea(this);
644     additionalBoardsManagerURLTextArea.setText(additionalBoardsManagerField.getText());
645     additionalBoardsManagerURLTextArea.onOk(e -> additionalBoardsManagerField.setText(additionalBoardsManagerURLTextArea.getText()));
646     additionalBoardsManagerURLTextArea.setVisible(true);
647   }//GEN-LAST:event_extendedAdditionalUrlFieldWindowActionPerformed
648 
browseButtonActionPerformed(java.awt.event.ActionEvent evt)649   private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
650     File dflt = new File(sketchbookLocationField.getText());
651     File file = Base.selectFolder(tr("Select new sketchbook location"), dflt, this);
652     if (file != null) {
653       String path = file.getAbsolutePath();
654       sketchbookLocationField.setText(path);
655     }
656   }//GEN-LAST:event_browseButtonActionPerformed
657 
autoScaleCheckBoxItemStateChanged(java.awt.event.ItemEvent evt)658   private void autoScaleCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_autoScaleCheckBoxItemStateChanged
659     scaleSpinner.setEnabled(!autoScaleCheckBox.isSelected());
660   }//GEN-LAST:event_autoScaleCheckBoxItemStateChanged
661 
662   // Variables declaration - do not modify//GEN-BEGIN:variables
663   private javax.swing.JTextField additionalBoardsManagerField;
664   private javax.swing.JLabel additionalBoardsManagerLabel;
665   private javax.swing.JLabel arduinoNotRunningLabel;
666   private javax.swing.JRadioButton autoProxy;
667   private javax.swing.JTextField autoProxyPACURL;
668   private javax.swing.JPasswordField autoProxyPassword;
669   private javax.swing.JLabel autoProxyPasswordLabel;
670   private javax.swing.JCheckBox autoProxyUsePAC;
671   private javax.swing.JTextField autoProxyUsername;
672   private javax.swing.JLabel autoProxyUsernameLabel;
673   private javax.swing.JCheckBox autoScaleCheckBox;
674   private javax.swing.JButton browseButton;
675   private javax.swing.JCheckBox checkUpdatesBox;
676   private javax.swing.JPanel checkboxesContainer;
677   private javax.swing.JComboBox comboLanguage;
678   private javax.swing.JLabel comboLanguageLabel;
679   private javax.swing.JComboBox comboWarnings;
680   private javax.swing.JLabel comboWarningsLabel;
681   private javax.swing.JCheckBox displayLineNumbersBox;
682   private javax.swing.JCheckBox enableCodeFoldingBox;
683   private javax.swing.JButton extendedAdditionalUrlFieldWindow;
684   private javax.swing.JCheckBox externalEditorBox;
685   private javax.swing.JCheckBox cacheCompiledCore;
686   private javax.swing.JTextField fontSizeField;
687   private javax.swing.JLabel fontSizeLabel;
688   private javax.swing.JLabel jLabel1;
689   private javax.swing.JLabel jLabel2;
690   private javax.swing.JLabel jLabel3;
691   private javax.swing.JPanel jPanel1;
692   private javax.swing.JRadioButton manualProxy;
693   private javax.swing.JRadioButton manualProxyHTTP;
694   private javax.swing.JTextField manualProxyHostName;
695   private javax.swing.JLabel manualProxyHostNameLabel;
696   private javax.swing.JPasswordField manualProxyPassword;
697   private javax.swing.JLabel manualProxyPasswordLabel;
698   private javax.swing.JTextField manualProxyPort;
699   private javax.swing.JLabel manualProxyPortLabel;
700   private javax.swing.JRadioButton manualProxySOCKS;
701   private javax.swing.ButtonGroup manualProxyTypeButtonGroup;
702   private javax.swing.JTextField manualProxyUsername;
703   private javax.swing.JLabel manualProxyUsernameLabel;
704   private javax.swing.JLabel morePreferencesLabel;
705   private javax.swing.JRadioButton noProxy;
706   private javax.swing.JLabel preferencesFileLabel;
707   private javax.swing.ButtonGroup proxyTypeButtonGroup;
708   private javax.swing.JLabel requiresRestartLabel;
709   private javax.swing.JCheckBox saveVerifyUploadBox;
710   private javax.swing.JSpinner scaleSpinner;
711   private javax.swing.JLabel showVerboseLabel;
712   private javax.swing.JTextField sketchbookLocationField;
713   private javax.swing.JLabel sketchbookLocationLabel;
714   private javax.swing.JCheckBox updateExtensionBox;
715   private javax.swing.JCheckBox verboseCompilationBox;
716   private javax.swing.JCheckBox verboseUploadBox;
717   private javax.swing.JCheckBox verifyUploadBox;
718   // End of variables declaration//GEN-END:variables
719 
validateData()720   private java.util.List<String> validateData() {
721     java.util.List<String> errors = new LinkedList<>();
722     if (FileUtils.isSubDirectory(new File(sketchbookLocationField.getText()), new File(PreferencesData.get("runtime.ide.path")))) {
723       errors.add(tr("The specified sketchbook folder contains your copy of the IDE.\nPlease choose a different folder for your sketchbook."));
724     }
725     return errors;
726   }
727 
savePreferencesData()728   private void savePreferencesData() {
729     String oldPath = PreferencesData.get("sketchbook.path");
730     String newPath = sketchbookLocationField.getText();
731     if (newPath.isEmpty()) {
732       if (BaseNoGui.getPortableFolder() == null) {
733         newPath = base.getDefaultSketchbookFolderOrPromptForIt().toString();
734       } else {
735         newPath = BaseNoGui.getPortableSketchbookFolder();
736       }
737     }
738     if (!newPath.equals(oldPath)) {
739       base.rebuildSketchbookMenus();
740       PreferencesData.set("sketchbook.path", newPath);
741     }
742 
743     Language newLanguage = (Language) comboLanguage.getSelectedItem();
744     PreferencesData.set("editor.languages.current", newLanguage.getIsoCode());
745 
746     String newSizeText = fontSizeField.getText();
747     try {
748       int newSize = Integer.parseInt(newSizeText.trim());
749       String pieces[] = PApplet.split(PreferencesData.get("editor.font"), ',');
750       pieces[2] = String.valueOf(newSize);
751       PreferencesData.set("editor.font", PApplet.join(pieces, ','));
752 
753     } catch (Exception e) {
754       System.err.println(I18n.format(tr("ignoring invalid font size {0}"), newSizeText));
755     }
756 
757     if (autoScaleCheckBox.isSelected()) {
758       PreferencesData.set("gui.scale", "auto");
759     } else {
760       PreferencesData.set("gui.scale", scaleSpinner.getValue().toString());
761     }
762 
763     // put each of the settings into the table
764     PreferencesData.setBoolean("build.verbose", verboseCompilationBox.isSelected());
765     PreferencesData.setBoolean("upload.verbose", verboseUploadBox.isSelected());
766 
767     WarningItem warningItem = (WarningItem) comboWarnings.getSelectedItem();
768     PreferencesData.set("compiler.warning_level", warningItem.getValue());
769 
770     PreferencesData.setBoolean("editor.linenumbers", displayLineNumbersBox.isSelected());
771 
772     PreferencesData.setBoolean("editor.code_folding", enableCodeFoldingBox.isSelected());
773 
774     PreferencesData.setBoolean("upload.verify", verifyUploadBox.isSelected());
775 
776     PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected());
777 
778     PreferencesData.setBoolean("editor.external", externalEditorBox.isSelected());
779 
780     PreferencesData.setBoolean("compiler.cache_core", cacheCompiledCore.isSelected());
781 
782     PreferencesData.setBoolean("update.check", checkUpdatesBox.isSelected());
783 
784     PreferencesData.setBoolean("editor.update_extension", updateExtensionBox.isSelected());
785 
786     PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected());
787 
788     PreferencesData.set("boardsmanager.additional.urls", additionalBoardsManagerField.getText().replace("\r\n", "\n").replace("\r", "\n").replace("\n", ","));
789 
790     PreferencesData.set(Constants.PREF_PROXY_TYPE, proxyTypeButtonGroup.getSelection().getActionCommand());
791     PreferencesData.set(Constants.PREF_PROXY_PAC_URL, autoProxyUsePAC.isSelected() ? autoProxyPACURL.getText() : "");
792     PreferencesData.set(Constants.PREF_PROXY_MANUAL_TYPE, manualProxyTypeButtonGroup.getSelection().getActionCommand());
793     PreferencesData.set(Constants.PREF_PROXY_MANUAL_HOSTNAME, manualProxyHostName.getText());
794     PreferencesData.set(Constants.PREF_PROXY_MANUAL_PORT, manualProxyPort.getText());
795     PreferencesData.set(Constants.PREF_PROXY_MANUAL_USERNAME, manualProxyUsername.getText());
796     PreferencesData.set(Constants.PREF_PROXY_MANUAL_PASSWORD, String.valueOf(manualProxyPassword.getPassword()));
797     PreferencesData.set(Constants.PREF_PROXY_AUTO_USERNAME, autoProxyUsername.getText());
798     PreferencesData.set(Constants.PREF_PROXY_AUTO_PASSWORD, String.valueOf(autoProxyPassword.getPassword()));
799   }
800 
showPrerefencesData()801   private void showPrerefencesData() {
802     sketchbookLocationField.setText(PreferencesData.get("sketchbook.path"));
803 
804     String currentLanguageISOCode = PreferencesData.get("editor.languages.current");
805     for (Language language : Languages.languages) {
806       if (language.getIsoCode().equals(currentLanguageISOCode)) {
807         comboLanguage.setSelectedItem(language);
808       }
809     }
810 
811     Font editorFont = PreferencesData.getFont("editor.font");
812     fontSizeField.setText(String.valueOf(editorFont.getSize()));
813 
814     try {
815       int scale = PreferencesData.getInteger("gui.scale", -1);
816       if (scale != -1) {
817         autoScaleCheckBox.setSelected(false);
818         scaleSpinner.setValue(scale);
819       }
820     } catch (NumberFormatException ignore) {
821       // In any case defaults to "auto"
822     }
823 
824     verboseCompilationBox.setSelected(PreferencesData.getBoolean("build.verbose"));
825     verboseUploadBox.setSelected(PreferencesData.getBoolean("upload.verbose"));
826 
827     String currentWarningLevel = PreferencesData.get("compiler.warning_level", "none");
828     for (WarningItem item : warningItems) {
829       if (currentWarningLevel.equals(item.getValue())) {
830         comboWarnings.setSelectedItem(item);
831       }
832     }
833 
834     displayLineNumbersBox.setSelected(PreferencesData.getBoolean("editor.linenumbers"));
835 
836     enableCodeFoldingBox.setSelected(PreferencesData.getBoolean("editor.code_folding"));
837 
838     verifyUploadBox.setSelected(PreferencesData.getBoolean("upload.verify"));
839 
840     externalEditorBox.setSelected(PreferencesData.getBoolean("editor.external"));
841 
842     cacheCompiledCore.setSelected(PreferencesData.get("compiler.cache_core") == null || PreferencesData.getBoolean("compiler.cache_core"));
843 
844     checkUpdatesBox.setSelected(PreferencesData.getBoolean("update.check"));
845 
846     updateExtensionBox.setSelected(PreferencesData.get("editor.update_extension") == null || PreferencesData.getBoolean("editor.update_extension"));
847 
848     saveVerifyUploadBox.setSelected(PreferencesData.getBoolean("editor.save_on_verify"));
849 
850     additionalBoardsManagerField.setText(PreferencesData.get("boardsmanager.additional.urls"));
851 
852     disableAllProxyFields();
853     String proxyType = PreferencesData.get(Constants.PREF_PROXY_TYPE, Constants.PROXY_TYPE_AUTO);
854 
855     if (Constants.PROXY_TYPE_NONE.equals(proxyType)) {
856       noProxy.setSelected(true);
857     } else if (Constants.PROXY_TYPE_AUTO.equals(proxyType)) {
858       autoProxy.setSelected(true);
859       autoProxyFieldsSetEnabled(true);
860       if (!PreferencesData.get(Constants.PREF_PROXY_PAC_URL, "").isEmpty()) {
861         autoProxyUsePAC.setSelected(true);
862         autoProxyPACURL.setText(PreferencesData.get(Constants.PREF_PROXY_PAC_URL));
863         autoProxyUsername.setText(PreferencesData.get(Constants.PREF_PROXY_AUTO_USERNAME));
864         autoProxyPassword.setText(PreferencesData.get(Constants.PREF_PROXY_AUTO_PASSWORD));
865       }
866     } else {
867       manualProxy.setSelected(true);
868       manualProxyFieldsSetEnabled(true);
869       manualProxyHostName.setText(PreferencesData.get(Constants.PREF_PROXY_MANUAL_HOSTNAME));
870       manualProxyPort.setText(PreferencesData.get(Constants.PREF_PROXY_MANUAL_PORT));
871       manualProxyUsername.setText(PreferencesData.get(Constants.PREF_PROXY_MANUAL_USERNAME));
872       manualProxyPassword.setText(PreferencesData.get(Constants.PREF_PROXY_MANUAL_PASSWORD));
873     }
874 
875     String selectedManualProxyType = PreferencesData.get(Constants.PREF_PROXY_MANUAL_TYPE, Constants.PROXY_MANUAL_TYPE_HTTP);
876     manualProxyHTTP.setSelected(Constants.PROXY_MANUAL_TYPE_HTTP.equals(selectedManualProxyType));
877     manualProxySOCKS.setSelected(Constants.PROXY_MANUAL_TYPE_SOCKS.equals(selectedManualProxyType));
878   }
879 
manualProxyFieldsSetEnabled(boolean enabled)880   private void manualProxyFieldsSetEnabled(boolean enabled) {
881     manualProxySOCKS.setEnabled(enabled);
882     manualProxyHTTP.setEnabled(enabled);
883     manualProxyHostNameLabel.setEnabled(enabled);
884     manualProxyHostName.setEnabled(enabled);
885     manualProxyPortLabel.setEnabled(enabled);
886     manualProxyPort.setEnabled(enabled);
887     manualProxyUsernameLabel.setEnabled(enabled);
888     manualProxyUsername.setEnabled(enabled);
889     manualProxyPasswordLabel.setEnabled(enabled);
890     manualProxyPassword.setEnabled(enabled);
891   }
892 
autoProxyFieldsSetEnabled(boolean enabled)893   private void autoProxyFieldsSetEnabled(boolean enabled) {
894     autoProxyUsePAC.setEnabled(enabled);
895     autoProxyPACFieldsSetEnabled(enabled && autoProxyUsePAC.isSelected());
896   }
897 
autoProxyPACFieldsSetEnabled(boolean enabled)898   private void autoProxyPACFieldsSetEnabled(boolean enabled) {
899     autoProxyPACURL.setEnabled(enabled);
900     autoProxyUsername.setEnabled(enabled);
901     autoProxyUsernameLabel.setEnabled(enabled);
902     autoProxyPassword.setEnabled(enabled);
903     autoProxyPasswordLabel.setEnabled(enabled);
904   }
905 
disableAllProxyFields()906   private void disableAllProxyFields() {
907     autoProxyFieldsSetEnabled(false);
908     manualProxyFieldsSetEnabled(false);
909   }
910 }
911