From c3d3016049855f8624bee23452ac71635c15d4e8 Mon Sep 17 00:00:00 2001 From: Ish Gupta Date: Thu, 14 May 2015 18:30:17 +0530 Subject: [PATCH 1/5] Updated cursor.ino Previous commit broke the actual functionality. The code was confusing and worked until the previous commit. The changes make it logically and functionally correct. --- libraries/LiquidCrystal/examples/setCursor/setCursor.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/LiquidCrystal/examples/setCursor/setCursor.ino b/libraries/LiquidCrystal/examples/setCursor/setCursor.ino index 4790b68b804..df75f7fe98c 100644 --- a/libraries/LiquidCrystal/examples/setCursor/setCursor.ino +++ b/libraries/LiquidCrystal/examples/setCursor/setCursor.ino @@ -7,7 +7,7 @@ can usually tell them by the 16-pin interface. This sketch prints to all the positions of the LCD using the - setCursor(0 method: + setCursor() method: The circuit: * LCD RS pin to digital pin 12 @@ -56,9 +56,9 @@ void loop() { // loop from ASCII 'a' to ASCII 'z': for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) { // loop over the columns: - for (int thisCol = 0; thisCol < numRows; thisCol++) { + for (int thisRow = 0; thisRow < numRows; thisRow++) { // loop over the rows: - for (int thisRow = 0; thisRow < numCols; thisRow++) { + for (int thisCol = 0; thisCol < numCols; thisCol++) { // set the cursor position: lcd.setCursor(thisCol, thisRow); // print the letter: From 7816ee3f10f70e21d7a6bd3a90d4b31ffd530875 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 15 May 2015 15:23:23 +0200 Subject: [PATCH 2/5] New Preferences window: renders fine on every OS and it's easier to adapt using NetBeans as visual editor. Fixes #3140 --- .../cc/arduino/view/SplashScreenHelper.java | 2 +- app/src/cc/arduino/view/StubMenuListener.java | 29 + .../AdditionalBoardsManagerURLTextArea.java | 3 +- .../arduino/view/preferences/Preferences.form | 634 ++++++++++++++ .../arduino/view/preferences/Preferences.java | 770 ++++++++++++++++++ app/src/processing/app/Base.java | 20 +- app/src/processing/app/Editor.java | 2 +- arduino-core/src/processing/app/I18n.java | 10 +- .../src/processing/app/PreferencesData.java | 4 + 9 files changed, 1457 insertions(+), 17 deletions(-) create mode 100644 app/src/cc/arduino/view/preferences/Preferences.form create mode 100644 app/src/cc/arduino/view/preferences/Preferences.java diff --git a/app/src/cc/arduino/view/SplashScreenHelper.java b/app/src/cc/arduino/view/SplashScreenHelper.java index d9f5fedb632..7d5948fec8b 100644 --- a/app/src/cc/arduino/view/SplashScreenHelper.java +++ b/app/src/cc/arduino/view/SplashScreenHelper.java @@ -89,7 +89,7 @@ public void close() { splash.close(); } - public void printText(String str) { + private void printText(String str) { System.out.println(str); } diff --git a/app/src/cc/arduino/view/StubMenuListener.java b/app/src/cc/arduino/view/StubMenuListener.java index 7d2cfe591dd..dd9654b8295 100644 --- a/app/src/cc/arduino/view/StubMenuListener.java +++ b/app/src/cc/arduino/view/StubMenuListener.java @@ -1,3 +1,32 @@ +/* + * This file is part of Arduino. + * + * Copyright 2015 Arduino LLC (http://www.arduino.cc/) + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + */ + package cc.arduino.view; import javax.swing.event.MenuEvent; diff --git a/app/src/cc/arduino/view/preferences/AdditionalBoardsManagerURLTextArea.java b/app/src/cc/arduino/view/preferences/AdditionalBoardsManagerURLTextArea.java index e09574e9bef..a75e1c8b43a 100644 --- a/app/src/cc/arduino/view/preferences/AdditionalBoardsManagerURLTextArea.java +++ b/app/src/cc/arduino/view/preferences/AdditionalBoardsManagerURLTextArea.java @@ -35,6 +35,7 @@ import com.google.common.collect.FluentIterable; import processing.app.Base; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; @@ -47,7 +48,7 @@ public class AdditionalBoardsManagerURLTextArea extends javax.swing.JDialog { private ActionListener onOkListener; - public AdditionalBoardsManagerURLTextArea(java.awt.Frame parent) { + public AdditionalBoardsManagerURLTextArea(Window parent) { super(parent); initComponents(); setLocationRelativeTo(parent); diff --git a/app/src/cc/arduino/view/preferences/Preferences.form b/app/src/cc/arduino/view/preferences/Preferences.form new file mode 100644 index 00000000000..8286450180d --- /dev/null +++ b/app/src/cc/arduino/view/preferences/Preferences.form @@ -0,0 +1,634 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/app/src/cc/arduino/view/preferences/Preferences.java b/app/src/cc/arduino/view/preferences/Preferences.java new file mode 100644 index 00000000000..2d026297013 --- /dev/null +++ b/app/src/cc/arduino/view/preferences/Preferences.java @@ -0,0 +1,770 @@ +/* + * This file is part of Arduino. + * + * Copyright 2015 Arduino LLC (http://www.arduino.cc/) + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + */ + +package cc.arduino.view.preferences; + +import processing.app.Base; +import processing.app.Editor; +import processing.app.I18n; +import processing.app.PreferencesData; +import processing.app.helpers.FileUtils; +import processing.app.helpers.OSUtils; +import processing.app.legacy.PApplet; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.io.File; + +import static processing.app.I18n._; + +public class Preferences extends javax.swing.JDialog { + + private final Language[] languages; + private final Language[] missingLanguages; + private final WarningItem[] warningItems; + private final Base base; + + public static class Language { + + private final String name; + private final String originalName; + private final String isoCode; + + public Language(String name, String originalName, String isoCode) { + this.name = name; + this.originalName = originalName; + this.isoCode = isoCode; + } + + public String toString() { + if (originalName.length() == 0) { + return name; + } + return originalName + " (" + name + ")"; + } + + public String getIsoCode() { + return isoCode; + } + } + + private static class WarningItem { + private final String value; + private final String translation; + + public WarningItem(String value, String translation) { + this.value = value; + this.translation = translation; + } + + public String getValue() { + return value; + } + + @Override + public String toString() { + return translation; + } + } + + public Preferences(Window parent, Base base) { + super(parent); + this.base = base; + + this.languages = new Language[]{ + new Language(_("System Default"), "", ""), + new Language(_("Albanian"), "shqip", "sq"), + new Language(_("Arabic"), "العربية", "ar"), + new Language(_("Aragonese"), "Aragonés", "an"), + new Language(_("Belarusian"), "Беларуская мова", "be"), + new Language(_("Bulgarian"), "български", "bg"), + new Language(_("Catalan"), "Català", "ca"), + new Language(_("Chinese Simplified"), "简体中文", "zh_CN"), + new Language(_("Chinese Traditional"), "繁體中文", "zh_TW"), + new Language(_("Croatian"), "Hrvatski", "hr_HR"), + new Language(_("Czech (Czech Republic)"), "český (Czech Republic)", "cs_CZ"), + new Language(_("Danish (Denmark)"), "Dansk (Denmark)", "da_DK"), + new Language(_("Dutch"), "Nederlands", "nl"), + new Language(_("English"), "English", "en"), + new Language(_("English (United Kingdom)"), "English (United Kingdom)", "en_GB"), + new Language(_("Estonian"), "Eesti", "et"), + new Language(_("Estonian (Estonia)"), "Eesti keel", "et_EE"), + new Language(_("Filipino"), "Pilipino", "fil"), + new Language(_("Finnish"), "Suomi", "fi"), + new Language(_("French"), "Français", "fr"), + new Language(_("Canadian French"), "Canadienne-français", "fr_CA"), + new Language(_("Galician"), "Galego", "gl"), + new Language(_("Georgian"), "საქართველოს", "ka_GE"), + new Language(_("German"), "Deutsch", "de_DE"), + new Language(_("Greek"), "ελληνικά", "el_GR"), + new Language(_("Hebrew"), "עברית", "he"), + new Language(_("Hindi"), "हिंदी", "hi"), + new Language(_("Hungarian"), "Magyar", "hu"), + new Language(_("Indonesian"), "Bahasa Indonesia", "id"), + new Language(_("Italian"), "Italiano", "it_IT"), + new Language(_("Japanese"), "日本語", "ja_JP"), + new Language(_("Korean"), "한국어", "ko_KR"), + new Language(_("Latvian"), "Latviešu", "lv_LV"), + new Language(_("Lithuaninan"), "Lietuvių Kalba", "lt_LT"), + new Language(_("Norwegian Bokmål"), "Norsk bokmål", "nb_NO"), + new Language(_("Persian"), "فارسی", "fa"), + new Language(_("Polish"), "Język Polski", "pl"), + new Language(_("Portuguese (Brazil)"), "Português (Brazil)", "pt_BR"), + new Language(_("Portuguese (Portugal)"), "Português (Portugal)", "pt_PT"), + new Language(_("Romanian"), "Română", "ro"), + new Language(_("Russian"), "Русский", "ru"), + new Language(_("Slovenian"), "Slovenščina", "sl_SI"), + new Language(_("Spanish"), "Español", "es"), + new Language(_("Swedish"), "Svenska", "sv"), + new Language(_("Tamil"), "தமிழ்", "ta"), + new Language(_("Turkish"), "Türk", "tr"), + new Language(_("Ukrainian"), "Український", "uk"), + new Language(_("Vietnamese"), "Tiếng Việt", "vi"), + }; + + this.missingLanguages = new Language[]{ + new Language(_("Afrikaans"), "Afrikaans", "af"), + new Language(_("Armenian"), "Հայերեն", "hy"), + new Language(_("Asturian"), "Asturianu", "ast"), + new Language(_("Basque"), "Euskara", "eu"), + new Language(_("Bengali (India)"), "বাংলা (India)", "bn_IN"), + new Language(_("Bosnian"), "Bosanski", "bs"), + new Language(_("Burmese (Myanmar)"), "ဗမာစကား", "my_MM"), + new Language(_("Chinese (China)"), "", "zh_CN"), + new Language(_("Chinese (Hong Kong)"), "", "zh_HK"), + new Language(_("Chinese (Taiwan)"), "", "zh_TW"), + new Language(_("Chinese (Taiwan) (Big5)"), "", "zh_TW.Big5"), + new Language(_("Czech"), "český", "cs"), + new Language(_("Danish"), "Dansk", "da"), + new Language(_("Dutch (Netherlands)"), "Nederlands", "nl_NL"), + new Language(_("Galician (Spain)"), "Galego (Spain)", "gl_ES"), + new Language(_("Nepali"), "नेपाली", "ne"), + new Language(_("N'Ko"), "ߒߞߏ", "nqo"), + new Language(_("Marathi"), "मराठी", "mr"), + new Language(_("Malay (Malaysia)"), "بهاس ملايو (Malaysia)", "ms_MY"), + new Language(_("Norwegian"), "Norsk", "no"), + new Language(_("Norwegian Nynorsk"), "Norsk Nynorsk", "nn"), + new Language(_("Portugese"), "Português", "pt"), + new Language(_("Persian (Iran)"), "فارسی (Iran)", "fa_IR"), + new Language(_("Slovak"), "Slovenčina", "sk"), + new Language(_("Swahili"), "كِسوَهِل", "sw"), + new Language(_("Talossan"), "Talossan", "tzl"), + new Language(_("Urdu (Pakistan)"), "اردو (Pakistan)", "ur_PK"), + new Language(_("Western Frisian"), "Western Frisian", "fy"), + }; + + this.warningItems = new WarningItem[]{ + new WarningItem("none", _("None")), + new WarningItem("default", _("Default")), + new WarningItem("more", _("More")), + new WarningItem("all", _("All")) + }; + + initComponents(); + + Base.registerWindowCloseKeys(getRootPane(), new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + cancelButtonActionPerformed(e); + } + }); + + if (!OSUtils.isWindows() || base.getPortableFolder() != null) { + autoAssociateBox.setEnabled(false); + autoAssociateBox.getParent().remove(autoAssociateBox); + } + + showPrerefencesData(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.JLabel sketchbookLocationLabel = new javax.swing.JLabel(); + sketchbookLocationField = new javax.swing.JTextField(); + javax.swing.JButton browseButton = new javax.swing.JButton(); + javax.swing.JLabel comboLanguageLabel = new javax.swing.JLabel(); + comboLanguage = new JComboBox(languages); + javax.swing.JLabel requiresRestartLabel = new javax.swing.JLabel(); + javax.swing.JLabel fontSizeLabel = new javax.swing.JLabel(); + fontSizeField = new javax.swing.JTextField(); + javax.swing.JLabel showVerboseLabel = new javax.swing.JLabel(); + verboseCompilationBox = new javax.swing.JCheckBox(); + verboseUploadBox = new javax.swing.JCheckBox(); + javax.swing.JLabel comboWarningsLabel = new javax.swing.JLabel(); + comboWarnings = new JComboBox(warningItems); + javax.swing.JPanel proxySettingsPanel = new javax.swing.JPanel(); + javax.swing.JLabel proxyHTTPServerLabel = new javax.swing.JLabel(); + proxyHTTPServer = new javax.swing.JTextField(); + javax.swing.JLabel proxyHTTPPortLabel = new javax.swing.JLabel(); + proxyHTTPPort = new javax.swing.JTextField(); + javax.swing.JLabel proxyHTTPSServerLabel = new javax.swing.JLabel(); + proxyHTTPSServer = new javax.swing.JTextField(); + javax.swing.JLabel proxyHTTPSPortLabel = new javax.swing.JLabel(); + proxyHTTPSPort = new javax.swing.JTextField(); + javax.swing.JLabel proxyUserLabel = new javax.swing.JLabel(); + proxyUser = new javax.swing.JTextField(); + javax.swing.JLabel proxyPasswordLabel = new javax.swing.JLabel(); + proxyPassword = new javax.swing.JPasswordField(); + javax.swing.JLabel additionalBoardsManagerLabel = new javax.swing.JLabel(); + additionalBoardsManagerField = new javax.swing.JTextField(); + javax.swing.JButton extendedAdditionalUrlFieldWindow = new javax.swing.JButton(); + javax.swing.JLabel morePreferencesLabel = new javax.swing.JLabel(); + preferencesFileLabel = new javax.swing.JLabel(); + javax.swing.JLabel arduinoNotRunningLabel = new javax.swing.JLabel(); + javax.swing.JButton okButton = new javax.swing.JButton(); + javax.swing.JButton cancelButton = new javax.swing.JButton(); + javax.swing.JPanel checkboxesContainer = new javax.swing.JPanel(); + displayLineNumbersBox = new javax.swing.JCheckBox(); + enableCodeFoldingBox = new javax.swing.JCheckBox(); + verifyUploadBox = new javax.swing.JCheckBox(); + externalEditorBox = new javax.swing.JCheckBox(); + checkUpdatesBox = new javax.swing.JCheckBox(); + updateExtensionBox = new javax.swing.JCheckBox(); + autoAssociateBox = new javax.swing.JCheckBox(); + saveVerifyUploadBox = new javax.swing.JCheckBox(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle(_("Preferences")); + setModal(true); + setResizable(false); + + sketchbookLocationLabel.setText(_("Sketchbook location:")); + + sketchbookLocationField.setColumns(40); + + browseButton.setText(I18n.PROMPT_BROWSE); + browseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + browseButtonActionPerformed(evt); + } + }); + + comboLanguageLabel.setText(_("Editor language: ")); + + requiresRestartLabel.setText(_(" (requires restart of Arduino)")); + + fontSizeLabel.setText(_("Editor font size: ")); + + fontSizeField.setColumns(4); + + showVerboseLabel.setText(_("Show verbose output during: ")); + + verboseCompilationBox.setText(_("compilation ")); + + verboseUploadBox.setText(_("upload")); + + comboWarningsLabel.setText(_("Compiler warnings: ")); + + proxySettingsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(_("Proxy Settings"))); + + proxyHTTPServerLabel.setText(_("Server (HTTP):")); + + proxyHTTPServer.setColumns(10); + + proxyHTTPPortLabel.setText(_("Port (HTTP):")); + + proxyHTTPPort.setColumns(10); + + proxyHTTPSServerLabel.setText(_("Server (HTTPS):")); + + proxyHTTPSServer.setColumns(10); + + proxyHTTPSPortLabel.setText(_("Port (HTTPS):")); + + proxyHTTPSPort.setColumns(10); + + proxyUserLabel.setText(_("Username:")); + + proxyUser.setColumns(10); + + proxyPasswordLabel.setText(_("Password:")); + + proxyPassword.setColumns(10); + + javax.swing.GroupLayout proxySettingsPanelLayout = new javax.swing.GroupLayout(proxySettingsPanel); + proxySettingsPanel.setLayout(proxySettingsPanelLayout); + proxySettingsPanelLayout.setHorizontalGroup( + proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(proxySettingsPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxyHTTPSServerLabel) + .addGroup(proxySettingsPanelLayout.createSequentialGroup() + .addGap(8, 8, 8) + .addComponent(proxyHTTPServerLabel))) + .addComponent(proxyUserLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxyHTTPServer) + .addComponent(proxyHTTPSServer) + .addComponent(proxyUser, javax.swing.GroupLayout.Alignment.TRAILING)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxyHTTPSPortLabel) + .addComponent(proxyPasswordLabel, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(proxyHTTPPortLabel, javax.swing.GroupLayout.Alignment.TRAILING)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(proxyHTTPSPort, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxyHTTPPort, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxyPassword, javax.swing.GroupLayout.Alignment.LEADING)) + .addContainerGap()) + ); + proxySettingsPanelLayout.setVerticalGroup( + proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(proxySettingsPanelLayout.createSequentialGroup() + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(proxySettingsPanelLayout.createSequentialGroup() + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyHTTPServerLabel) + .addComponent(proxyHTTPServer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyHTTPSServerLabel) + .addComponent(proxyHTTPSServer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyUser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(proxyUserLabel))) + .addGroup(proxySettingsPanelLayout.createSequentialGroup() + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyHTTPPortLabel) + .addComponent(proxyHTTPPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyHTTPSPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(proxyHTTPSPortLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(proxySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(proxyPasswordLabel) + .addComponent(proxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + additionalBoardsManagerLabel.setText(_("Additional Boards Manager URLs: ")); + + extendedAdditionalUrlFieldWindow.setIcon(new ImageIcon(Base.getThemeImage("newwindow.gif", this))); + extendedAdditionalUrlFieldWindow.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + extendedAdditionalUrlFieldWindowActionPerformed(evt); + } + }); + + morePreferencesLabel.setForeground(Color.GRAY); + morePreferencesLabel.setText(_("More preferences can be edited directly in the file")); + + preferencesFileLabel.setText(PreferencesData.getPreferencesFile().getAbsolutePath()); + preferencesFileLabel.addMouseListener(new java.awt.event.MouseAdapter() { + public void mousePressed(java.awt.event.MouseEvent evt) { + preferencesFileLabelMousePressed(evt); + } + + public void mouseExited(java.awt.event.MouseEvent evt) { + preferencesFileLabelMouseExited(evt); + } + + public void mouseEntered(java.awt.event.MouseEvent evt) { + preferencesFileLabelMouseEntered(evt); + } + }); + + arduinoNotRunningLabel.setForeground(Color.GRAY); + arduinoNotRunningLabel.setText(_("(edit only when Arduino is not running)")); + + okButton.setText(I18n.PROMPT_OK); + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + cancelButton.setText(I18n.PROMPT_CANCEL); + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + checkboxesContainer.setLayout(new javax.swing.BoxLayout(checkboxesContainer, javax.swing.BoxLayout.Y_AXIS)); + + displayLineNumbersBox.setText(_("Display line numbers")); + checkboxesContainer.add(displayLineNumbersBox); + + enableCodeFoldingBox.setText(_("Enable Code Folding")); + checkboxesContainer.add(enableCodeFoldingBox); + + verifyUploadBox.setText(_("Verify code after upload")); + checkboxesContainer.add(verifyUploadBox); + + externalEditorBox.setText(_("Use external editor")); + checkboxesContainer.add(externalEditorBox); + + checkUpdatesBox.setText(_("Check for updates on startup")); + checkboxesContainer.add(checkUpdatesBox); + + updateExtensionBox.setText(_("Update sketch files to new extension on save (.pde -> .ino)")); + checkboxesContainer.add(updateExtensionBox); + + autoAssociateBox.setText(_("Automatically associate .ino files with Arduino")); + checkboxesContainer.add(autoAssociateBox); + + saveVerifyUploadBox.setText(_("Save when verifying or uploading")); + checkboxesContainer.add(saveVerifyUploadBox); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(proxySettingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(sketchbookLocationField) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(browseButton)) + .addComponent(checkboxesContainer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(arduinoNotRunningLabel) + .addComponent(sketchbookLocationLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(comboWarningsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(comboWarnings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(morePreferencesLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(showVerboseLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(verboseCompilationBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(verboseUploadBox)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(comboLanguageLabel) + .addComponent(fontSizeLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(fontSizeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(comboLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(requiresRestartLabel)))) + .addComponent(preferencesFileLabel)) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(additionalBoardsManagerLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(additionalBoardsManagerField, javax.swing.GroupLayout.PREFERRED_SIZE, 494, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(extendedAdditionalUrlFieldWindow, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(okButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cancelButton))))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(sketchbookLocationLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(sketchbookLocationField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(browseButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(comboLanguageLabel) + .addComponent(comboLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(requiresRestartLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(fontSizeLabel) + .addComponent(fontSizeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(showVerboseLabel) + .addComponent(verboseCompilationBox) + .addComponent(verboseUploadBox)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(comboWarningsLabel) + .addComponent(comboWarnings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(checkboxesContainer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(proxySettingsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(additionalBoardsManagerLabel) + .addComponent(additionalBoardsManagerField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(extendedAdditionalUrlFieldWindow, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(morePreferencesLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(preferencesFileLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(arduinoNotRunningLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(okButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed + File dflt = new File(sketchbookLocationField.getText()); + File file = Base.selectFolder(_("Select new sketchbook location"), dflt, this); + if (file != null) { + String path = file.getAbsolutePath(); + if (Base.getPortableFolder() != null) { + path = FileUtils.relativePath(Base.getPortableFolder().toString(), path); + if (path == null) { + path = Base.getPortableSketchbookFolder(); + } + } + sketchbookLocationField.setText(path); + } + }//GEN-LAST:event_browseButtonActionPerformed + + private void extendedAdditionalUrlFieldWindowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extendedAdditionalUrlFieldWindowActionPerformed + final AdditionalBoardsManagerURLTextArea additionalBoardsManagerURLTextArea = new AdditionalBoardsManagerURLTextArea(this); + additionalBoardsManagerURLTextArea.setText(additionalBoardsManagerField.getText()); + additionalBoardsManagerURLTextArea.onOk(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + additionalBoardsManagerField.setText(additionalBoardsManagerURLTextArea.getText()); + } + }); + additionalBoardsManagerURLTextArea.setVisible(true); + }//GEN-LAST:event_extendedAdditionalUrlFieldWindowActionPerformed + + private void preferencesFileLabelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMouseEntered + preferencesFileLabel.setForeground(new Color(0, 0, 140)); + }//GEN-LAST:event_preferencesFileLabelMouseEntered + + private void preferencesFileLabelMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMousePressed + Base.openFolder(PreferencesData.getPreferencesFile().getParentFile()); + }//GEN-LAST:event_preferencesFileLabelMousePressed + + private void preferencesFileLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_preferencesFileLabelMouseExited + preferencesFileLabel.setForeground(Color.BLACK); + }//GEN-LAST:event_preferencesFileLabelMouseExited + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); + }//GEN-LAST:event_cancelButtonActionPerformed + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + savePreferencesData(); + for (Editor editor : base.getEditors()) { + editor.applyPreferences(); + } + cancelButtonActionPerformed(evt); + }//GEN-LAST:event_okButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField additionalBoardsManagerField; + private javax.swing.JCheckBox autoAssociateBox; + private javax.swing.JCheckBox checkUpdatesBox; + private javax.swing.JComboBox comboLanguage; + private javax.swing.JComboBox comboWarnings; + private javax.swing.JCheckBox displayLineNumbersBox; + private javax.swing.JCheckBox enableCodeFoldingBox; + private javax.swing.JCheckBox externalEditorBox; + private javax.swing.JTextField fontSizeField; + private javax.swing.JLabel preferencesFileLabel; + private javax.swing.JTextField proxyHTTPPort; + private javax.swing.JTextField proxyHTTPSPort; + private javax.swing.JTextField proxyHTTPSServer; + private javax.swing.JTextField proxyHTTPServer; + private javax.swing.JPasswordField proxyPassword; + private javax.swing.JTextField proxyUser; + private javax.swing.JCheckBox saveVerifyUploadBox; + private javax.swing.JTextField sketchbookLocationField; + private javax.swing.JCheckBox updateExtensionBox; + private javax.swing.JCheckBox verboseCompilationBox; + private javax.swing.JCheckBox verboseUploadBox; + private javax.swing.JCheckBox verifyUploadBox; + // End of variables declaration//GEN-END:variables + + private void savePreferencesData() { + String oldPath = PreferencesData.get("sketchbook.path"); + String newPath = sketchbookLocationField.getText(); + if (newPath.isEmpty()) { + if (base.getPortableFolder() == null) { + newPath = base.getDefaultSketchbookFolderOrPromptForIt().toString(); + } else { + newPath = base.getPortableSketchbookFolder(); + } + } + if (!newPath.equals(oldPath)) { + base.rebuildSketchbookMenus(); + PreferencesData.set("sketchbook.path", newPath); + } + + Language newLanguage = (Language) comboLanguage.getSelectedItem(); + PreferencesData.set("editor.languages.current", newLanguage.getIsoCode()); + + String newSizeText = fontSizeField.getText(); + try { + int newSize = Integer.parseInt(newSizeText.trim()); + String pieces[] = PApplet.split(PreferencesData.get("editor.font"), ','); + pieces[2] = String.valueOf(newSize); + PreferencesData.set("editor.font", PApplet.join(pieces, ',')); + + } catch (Exception e) { + System.err.println(I18n.format(_("ignoring invalid font size {0}"), newSizeText)); + } + + // put each of the settings into the table + PreferencesData.setBoolean("build.verbose", verboseCompilationBox.isSelected()); + PreferencesData.setBoolean("upload.verbose", verboseUploadBox.isSelected()); + + WarningItem warningItem = (WarningItem) comboWarnings.getSelectedItem(); + PreferencesData.set("compiler.warning_level", warningItem.getValue()); + + PreferencesData.setBoolean("editor.linenumbers", displayLineNumbersBox.isSelected()); + + PreferencesData.setBoolean("editor.code_folding", enableCodeFoldingBox.isSelected()); + + PreferencesData.setBoolean("upload.verify", verifyUploadBox.isSelected()); + + PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected()); + + PreferencesData.setBoolean("editor.external", externalEditorBox.isSelected()); + + PreferencesData.setBoolean("update.check", checkUpdatesBox.isSelected()); + + PreferencesData.setBoolean("editor.update_extension", updateExtensionBox.isSelected()); + + if (autoAssociateBox != null) { + PreferencesData.setBoolean("platform.auto_file_type_associations", autoAssociateBox.isSelected()); + } + + PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected()); + + PreferencesData.set("proxy.http.server", proxyHTTPServer.getText()); + try { + PreferencesData.set("proxy.http.port", Integer.valueOf(proxyHTTPPort.getText()).toString()); + } catch (NumberFormatException e) { + PreferencesData.remove("proxy.http.port"); + } + PreferencesData.set("proxy.https.server", proxyHTTPSServer.getText()); + try { + PreferencesData.set("proxy.https.port", Integer.valueOf(proxyHTTPSPort.getText()).toString()); + } catch (NumberFormatException e) { + PreferencesData.remove("proxy.https.port"); + } + PreferencesData.set("proxy.user", proxyUser.getText()); + PreferencesData.set("proxy.password", new String(proxyPassword.getPassword())); + + PreferencesData.set("boardsmanager.additional.urls", additionalBoardsManagerField.getText().replace("\r\n", "\n").replace("\r", "\n").replace("\n", ",")); + + //editor.applyPreferences(); + } + + private void showPrerefencesData() { + sketchbookLocationField.setText(PreferencesData.get("sketchbook.path")); + + String currentLanguageISOCode = PreferencesData.get("editor.languages.current"); + for (Language language : languages) { + if (language.getIsoCode().equals(currentLanguageISOCode)) { + comboLanguage.setSelectedItem(language); + } + } + + Font editorFont = PreferencesData.getFont("editor.font"); + fontSizeField.setText(String.valueOf(editorFont.getSize())); + + verboseCompilationBox.setSelected(PreferencesData.getBoolean("build.verbose")); + verboseUploadBox.setSelected(PreferencesData.getBoolean("upload.verbose")); + + String currentWarningLevel = PreferencesData.get("compiler.warning_level", "none"); + for (WarningItem item : warningItems) { + if (currentWarningLevel.equals(item.getValue())) { + comboWarnings.setSelectedItem(item); + } + } + + displayLineNumbersBox.setSelected(PreferencesData.getBoolean("editor.linenumbers")); + + enableCodeFoldingBox.setSelected(PreferencesData.getBoolean("editor.code_folding")); + + verifyUploadBox.setSelected(PreferencesData.getBoolean("upload.verify")); + + externalEditorBox.setSelected(PreferencesData.getBoolean("editor.external")); + + checkUpdatesBox.setSelected(PreferencesData.getBoolean("update.check")); + + updateExtensionBox.setSelected(PreferencesData.get("editor.update_extension") == null || PreferencesData.getBoolean("editor.update_extension")); + + if (autoAssociateBox != null) { + autoAssociateBox.setSelected(PreferencesData.getBoolean("platform.auto_file_type_associations")); + } + + saveVerifyUploadBox.setSelected(PreferencesData.getBoolean("editor.save_on_verify")); + + proxyHTTPServer.setText(PreferencesData.get("proxy.http.server")); + try { + proxyHTTPPort.setText(Integer.toString(PreferencesData.getInteger("proxy.http.port", 8080))); + } catch (NumberFormatException e) { + proxyHTTPPort.setText(""); + } + proxyHTTPSServer.setText(PreferencesData.get("proxy.https.server")); + try { + proxyHTTPSPort.setText(Integer.toString(PreferencesData.getInteger("proxy.https.port", 8443))); + } catch (NumberFormatException e) { + proxyHTTPSPort.setText(""); + } + proxyUser.setText(PreferencesData.get("proxy.user")); + proxyPassword.setText(PreferencesData.get("proxy.password")); + + additionalBoardsManagerField.setText(PreferencesData.get("boardsmanager.additional.urls")); + } +} diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index ea5c67466b9..41e53169dea 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -92,9 +92,6 @@ public boolean apply(UserLibrary library) { public static SplashScreenHelper splashScreenHelper = new SplashScreenHelper(SplashScreen.getSplashScreen()); - // A single instance of the preferences window - Preferences preferencesFrame; - // set to true after the first time the menu is built. // so that the errors while building don't show up again. boolean builtOnce; @@ -1123,7 +1120,7 @@ protected boolean handleQuitEach() { * Asynchronous version of menu rebuild to be used on save and rename * to prevent the interface from locking up until the menus are done. */ - protected void rebuildSketchbookMenus() { + public void rebuildSketchbookMenus() { //System.out.println("async enter"); //new Exception().printStackTrace(); SwingUtilities.invokeLater(new Runnable() { @@ -1815,8 +1812,13 @@ public void mousePressed(MouseEvent e) { * Show the Preferences window. */ public void handlePrefs() { - if (preferencesFrame == null) preferencesFrame = new Preferences(); - preferencesFrame.showFrame(activeEditor); + cc.arduino.view.preferences.Preferences dialog = new cc.arduino.view.preferences.Preferences(activeEditor, this); + if (activeEditor != null) { + dialog.setLocationRelativeTo(activeEditor); + } + dialog.pack(); + dialog.setMinimumSize(dialog.getSize()); + dialog.setVisible(true); } @@ -2025,7 +2027,7 @@ static public File getSketchbookHardwareFolder() { } - protected File getDefaultSketchbookFolderOrPromptForIt() { + public File getDefaultSketchbookFolderOrPromptForIt() { File sketchbookFolder = BaseNoGui.getDefaultSketchbookFolder(); @@ -2119,7 +2121,7 @@ static public void openFolder(File file) { // ................................................................. - static public File selectFolder(String prompt, File folder, Frame frame) { + static public File selectFolder(String prompt, File folder, Component parent) { JFileChooser fc = new JFileChooser(); fc.setDialogTitle(prompt); if (folder != null) { @@ -2127,7 +2129,7 @@ static public File selectFolder(String prompt, File folder, Frame frame) { } fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int returned = fc.showOpenDialog(new JDialog()); + int returned = fc.showOpenDialog(parent); if (returned == JFileChooser.APPROVE_OPTION) { return fc.getSelectedFile(); } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index ef87a62191e..0ab7c67aec4 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -443,7 +443,7 @@ protected int[] getPlacement() { * the app is just starting up, or the user just finished messing * with things in the Preferences window. */ - protected void applyPreferences() { + public void applyPreferences() { // apply the setting for 'use external editor' boolean external = PreferencesData.getBoolean("editor.external"); diff --git a/arduino-core/src/processing/app/I18n.java b/arduino-core/src/processing/app/I18n.java index d6480d99ef7..ef71ce3652a 100644 --- a/arduino-core/src/processing/app/I18n.java +++ b/arduino-core/src/processing/app/I18n.java @@ -24,11 +24,11 @@ public class I18n { // prompt text stuff - static String PROMPT_YES; - static String PROMPT_NO; - static String PROMPT_CANCEL; - static String PROMPT_OK; - static String PROMPT_BROWSE; + public static String PROMPT_YES; + public static String PROMPT_NO; + public static String PROMPT_CANCEL; + public static String PROMPT_OK; + public static String PROMPT_BROWSE; static protected void init(String language) throws MissingResourceException { String[] languageParts = language.split("_"); diff --git a/arduino-core/src/processing/app/PreferencesData.java b/arduino-core/src/processing/app/PreferencesData.java index 6ee44fb344e..7733b08e4e5 100644 --- a/arduino-core/src/processing/app/PreferencesData.java +++ b/arduino-core/src/processing/app/PreferencesData.java @@ -88,6 +88,10 @@ static public void init(File file) { fixPreferences(); } + public static File getPreferencesFile() { + return preferencesFile; + } + private static void fixPreferences() { String baud = get("serial.debug_rate"); if ("14400".equals(baud) || "28800".equals(baud)) { From d3b3dbb29985e5ead60698cbf687b8241a93b3e7 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 15 May 2015 15:30:53 +0200 Subject: [PATCH 3/5] Old Preferences class remains for backwards compatibility as a delegate for PreferencesData --- app/src/processing/app/Editor.java | 4 +- app/src/processing/app/Preferences.java | 814 +----------------------- 2 files changed, 10 insertions(+), 808 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 0ab7c67aec4..37d258ed102 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -258,7 +258,7 @@ public void windowDeactivated(WindowEvent e) { scrollPane = new RTextScrollPane(textarea, true); scrollPane.setBorder(new MatteBorder(0, 6, 0, 0, Theme.getColor("editor.bgcolor"))); scrollPane.setViewportBorder(BorderFactory.createEmptyBorder()); - scrollPane.setLineNumbersEnabled(Preferences.getBoolean("editor.linenumbers")); + scrollPane.setLineNumbersEnabled(PreferencesData.getBoolean("editor.linenumbers")); scrollPane.setIconRowHeaderEnabled(false); Gutter gutter = scrollPane.getGutter(); @@ -1794,7 +1794,7 @@ protected void setCode(final SketchCodeDocument codeDoc) { if (document == null) { // this document not yet inited document = new RSyntaxDocument(new ArduinoTokenMakerFactory(base.getPdeKeywords()), RSyntaxDocument.SYNTAX_STYLE_CPLUSPLUS); - document.putProperty(PlainDocument.tabSizeAttribute, Preferences.getInteger("editor.tabs.size")); + document.putProperty(PlainDocument.tabSizeAttribute, PreferencesData.getInteger("editor.tabs.size")); // insert the program text into the document object try { diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index f55b976af1f..6f76d6e4f29 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -21,44 +21,30 @@ package processing.app; -import cc.arduino.view.preferences.AdditionalBoardsManagerURLTextArea; -import com.google.common.base.Function; -import com.google.common.base.Functions; -import com.google.common.base.Joiner; -import com.google.common.collect.Collections2; -import processing.app.helpers.FileUtils; -import processing.app.helpers.OSUtils; import processing.app.helpers.PreferencesHelper; import processing.app.helpers.PreferencesMap; -import processing.app.legacy.PApplet; -import javax.swing.*; import java.awt.*; -import java.awt.event.*; import java.io.File; -import java.util.*; -import java.util.List; - -import static processing.app.I18n._; /** * Storage class for user preferences and environment settings. - *

+ *

* This class no longer uses the Properties class, since * properties files are iso8859-1, which is highly likely to * be a problem when trying to save sketch folders and locations. - *

+ *

* The GUI portion in here is really ugly, as it uses exact layout. This was * done in frustration one evening (and pre-Swing), but that's long since past, * and it should all be moved to a proper swing layout like BoxLayout. - *

+ *

* This is very poorly put together, that the preferences panel and the actual * preferences i/o is part of the same code. But there hasn't yet been a * compelling reason to bother with the separation aside from concern about * being lectured by strangers who feel that it doesn't look like what they * learned in CS class. - *

+ *

* Would also be possible to change this to use the Java Preferences API. * Some useful articles * here and @@ -71,131 +57,12 @@ */ public class Preferences { - class Language { - Language(String _name, String _originalName, String _isoCode) { - name = _name; - originalName = _originalName; - isoCode = _isoCode; - } - - public String toString() { - if (originalName.length() == 0) - return name; - return originalName + " (" + name + ")"; - }; - - String name; - String originalName; - String isoCode; - } - - Language languages[] = { - new Language(_("System Default"), "", ""), - new Language(_("Albanian"), "shqip", "sq"), - new Language(_("Arabic"), "العربية", "ar"), - new Language(_("Aragonese"), "Aragonés", "an"), - new Language(_("Belarusian"), "Беларуская мова", "be"), - new Language(_("Bulgarian"), "български", "bg"), - new Language(_("Catalan"), "Català", "ca"), - new Language(_("Chinese Simplified"), "简体中文", "zh_CN"), - new Language(_("Chinese Traditional"), "繁體中文", "zh_TW"), - new Language(_("Croatian"), "Hrvatski", "hr_HR"), - new Language(_("Czech (Czech Republic)"), "český (Czech Republic)", "cs_CZ"), - new Language(_("Danish (Denmark)"), "Dansk (Denmark)", "da_DK"), - new Language(_("Dutch"), "Nederlands", "nl"), - new Language(_("English"), "English", "en"), - new Language(_("English (United Kingdom)"), "English (United Kingdom)", "en_GB"), - new Language(_("Estonian"), "Eesti", "et"), - new Language(_("Estonian (Estonia)"), "Eesti keel", "et_EE"), - new Language(_("Filipino"), "Pilipino", "fil"), - new Language(_("Finnish"), "Suomi", "fi"), - new Language(_("French"), "Français", "fr"), - new Language(_("Canadian French"), "Canadienne-français", "fr_CA"), - new Language(_("Galician"), "Galego", "gl"), - new Language(_("Georgian"), "საქართველოს", "ka_GE"), - new Language(_("German"), "Deutsch", "de_DE"), - new Language(_("Greek"), "ελληνικά", "el_GR"), - new Language(_("Hebrew"), "עברית", "he"), - new Language(_("Hindi"), "हिंदी", "hi"), - new Language(_("Hungarian"), "Magyar", "hu"), - new Language(_("Indonesian"), "Bahasa Indonesia", "id"), - new Language(_("Italian"), "Italiano", "it_IT"), - new Language(_("Japanese"), "日本語", "ja_JP"), - new Language(_("Korean"), "한국어", "ko_KR"), - new Language(_("Latvian"), "Latviešu", "lv_LV"), - new Language(_("Lithuaninan"), "Lietuvių Kalba", "lt_LT"), - new Language(_("Norwegian Bokmål"), "Norsk bokmål", "nb_NO"), - new Language(_("Persian"), "فارسی", "fa"), - new Language(_("Polish"), "Język Polski", "pl"), - new Language(_("Portuguese (Brazil)"), "Português (Brazil)", "pt_BR"), - new Language(_("Portuguese (Portugal)"), "Português (Portugal)", "pt_PT"), - new Language(_("Romanian"), "Română", "ro"), - new Language(_("Russian"), "Русский", "ru"), - new Language(_("Slovenian"), "Slovenščina", "sl_SI"), - new Language(_("Spanish"), "Español", "es"), - new Language(_("Swedish"), "Svenska", "sv"), - new Language(_("Tamil"), "தமிழ்", "ta"), - new Language(_("Turkish"), "Türk", "tr"), - new Language(_("Ukrainian"), "Український", "uk"), - new Language(_("Vietnamese"), "Tiếng Việt", "vi"), - }; - - // Incomplete languages - Language missingLanguages[] = { - new Language(_("Afrikaans"), "Afrikaans", "af"), - new Language(_("Armenian"), "Հայերեն", "hy"), - new Language(_("Asturian"), "Asturianu", "ast"), - new Language(_("Basque"), "Euskara", "eu"), - new Language(_("Bengali (India)"), "বাংলা (India)", "bn_IN"), - new Language(_("Bosnian"), "Bosanski", "bs"), - new Language(_("Burmese (Myanmar)"), "ဗမာစကား", "my_MM"), - new Language(_("Chinese (China)"), "", "zh_CN"), - new Language(_("Chinese (Hong Kong)"), "", "zh_HK"), - new Language(_("Chinese (Taiwan)"), "", "zh_TW"), - new Language(_("Chinese (Taiwan) (Big5)"), "", "zh_TW.Big5"), - new Language(_("Czech"), "český", "cs"), - new Language(_("Danish"), "Dansk", "da"), - new Language(_("Dutch (Netherlands)"), "Nederlands", "nl_NL"), - new Language(_("Galician (Spain)"), "Galego (Spain)", "gl_ES"), - new Language(_("Nepali"), "नेपाली", "ne"), - new Language(_("N'Ko"), "ߒߞߏ", "nqo"), - new Language(_("Marathi"), "मराठी", "mr"), - new Language(_("Malay (Malaysia)"), "بهاس ملايو (Malaysia)", "ms_MY"), - new Language(_("Norwegian"), "Norsk", "no"), - new Language(_("Norwegian Nynorsk"), "Norsk Nynorsk", "nn"), - new Language(_("Portugese"), "Português", "pt"), - new Language(_("Persian (Iran)"), "فارسی (Iran)", "fa_IR"), - new Language(_("Slovak"), "Slovenčina", "sk"), - new Language(_("Swahili"), "كِسوَهِل", "sw"), - new Language(_("Talossan"), "Talossan", "tzl"), - new Language(_("Urdu (Pakistan)"), "اردو (Pakistan)", "ur_PK"), - new Language(_("Western Frisian"), "Western Frisian", "fy"), - }; - - private static class WarningItem { - private final String value; - private final String translation; - - public WarningItem(String value, String translation) { - this.value = value; - this.translation = translation; - } - - public String getValue() { - return value; - } - - @Override - public String toString() { - return translation; - } - } /** * Standardized width for buttons. Mac OS X 10.3 wants 70 as its default, * Windows XP needs 66, and my Ubuntu machine needs 80+, so 80 seems proper. */ - static public int BUTTON_WIDTH = 80; + static public int BUTTON_WIDTH = 80; /** * Standardized button height. Mac OS X 10.3 (Java 1.4) wants 29, @@ -208,687 +75,22 @@ public String toString() { // value for the size bars, buttons, etc - static final int GRID_SIZE = 33; + static final int GRID_SIZE = 33; // indents and spacing standards. these probably need to be modified // per platform as well, since macosx is so huge, windows is smaller, // and linux is all over the map - static final int GUI_BIG = 13; - static final int GUI_BETWEEN = 5; - static final int GUI_SMALL = 6; - - // gui elements - - JFrame dialog; - int wide, high; - - JTextField sketchbookLocationField; - JCheckBox exportSeparateBox; - JCheckBox verboseCompilationBox; - JCheckBox verboseUploadBox; - JCheckBox displayLineNumbersBox; - JCheckBox enableCodeFoldingBox; - JCheckBox verifyUploadBox; - JCheckBox externalEditorBox; - JCheckBox checkUpdatesBox; - JTextField fontSizeField; - JCheckBox updateExtensionBox; - JCheckBox autoAssociateBox; - JComboBox comboLanguage; - JComboBox comboWarnings; - JCheckBox saveVerifyUploadBox; - JTextField proxyHTTPServer; - JTextField proxyHTTPPort; - JTextField proxyHTTPSServer; - JTextField proxyHTTPSPort; - JTextField proxyUser; - JPasswordField proxyPassword; - private final JTextField additionalBoardsManagerField; - - // the calling editor, so updates can be applied - - Editor editor; - + static final int GUI_SMALL = 6; static protected void init(File file) { - - PreferencesData.init(file); + PreferencesData.init(file); // other things that have to be set explicitly for the defaults PreferencesHelper.putColor(PreferencesData.prefs, "run.window.bgcolor", SystemColor.control); } - - public Preferences() { - - // setup dialog for the prefs - - //dialog = new JDialog(editor, "Preferences", true); - dialog = new JFrame(_("Preferences")); - dialog.setResizable(false); - - Container pane = dialog.getContentPane(); - pane.setLayout(null); - - int top = GUI_BIG; - int left = GUI_BIG; - int right = 0; - - JLabel label; - JButton button; //, button2; - //JComboBox combo; - Dimension d, d2; //, d3; - int h, vmax; - - - // Sketchbook location: - // [...............................] [ Browse ] - - label = new JLabel(_("Sketchbook location:")); - pane.add(label); - d = label.getPreferredSize(); - label.setBounds(left, top, d.width, d.height); - top += d.height; // + GUI_SMALL; - - sketchbookLocationField = new JTextField(40); - pane.add(sketchbookLocationField); - d = sketchbookLocationField.getPreferredSize(); - - button = new JButton(I18n.PROMPT_BROWSE); - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - File dflt = new File(sketchbookLocationField.getText()); - File file = - Base.selectFolder(_("Select new sketchbook location"), dflt, dialog); - if (file != null) { - String path = file.getAbsolutePath(); - if (Base.getPortableFolder() != null) { - path = FileUtils.relativePath(Base.getPortableFolder().toString(), path); - if (path == null) { - path = Base.getPortableSketchbookFolder(); - } - } - sketchbookLocationField.setText(path); - } - } - }); - pane.add(button); - d2 = button.getPreferredSize(); - - // take max height of all components to vertically align em - vmax = Math.max(d.height, d2.height); - sketchbookLocationField.setBounds(left, top + (vmax-d.height)/2, - d.width, d.height); - h = left + d.width + GUI_SMALL; - button.setBounds(h, top + (vmax-d2.height)/2, - d2.width, d2.height); - - right = Math.max(right, h + d2.width + GUI_BIG); - top += vmax + GUI_BETWEEN; - - - // Preferred language: [ ] (requires restart of Arduino) - Container box = Box.createHorizontalBox(); - label = new JLabel(_("Editor language: ")); - box.add(label); - comboLanguage = new JComboBox(languages); - String currentLanguage = PreferencesData.get("editor.languages.current"); - for (Language language : languages) { - if (language.isoCode.equals(currentLanguage)) - comboLanguage.setSelectedItem(language); - } - box.add(comboLanguage); - label = new JLabel(_(" (requires restart of Arduino)")); - box.add(label); - pane.add(box); - d = box.getPreferredSize(); - box.setForeground(Color.gray); - box.setBounds(left, top, d.width, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // Editor font size [ ] - - box = Box.createHorizontalBox(); - label = new JLabel(_("Editor font size: ")); - box.add(label); - fontSizeField = new JTextField(4); - box.add(fontSizeField); - label = new JLabel(_(" (requires restart of Arduino)")); - box.add(label); - pane.add(box); - d = box.getPreferredSize(); - box.setBounds(left, top, d.width, d.height); - Font editorFont = PreferencesData.getFont("editor.font"); - fontSizeField.setText(String.valueOf(editorFont.getSize())); - top += d.height + GUI_BETWEEN; - - // Show verbose output during: [ ] compilation [ ] upload - - box = Box.createHorizontalBox(); - label = new JLabel(_("Show verbose output during: ")); - box.add(label); - verboseCompilationBox = new JCheckBox(_("compilation ")); - box.add(verboseCompilationBox); - verboseUploadBox = new JCheckBox(_("upload")); - box.add(verboseUploadBox); - pane.add(box); - d = box.getPreferredSize(); - box.setBounds(left, top, d.width, d.height); - top += d.height + GUI_BETWEEN; - - // [ ] Enable all compiler warnings - - box = Box.createHorizontalBox(); - label = new JLabel(_("Compiler warnings: ")); - box.add(label); - WarningItem[] warningItems = new WarningItem[]{new WarningItem("none", _("None")), new WarningItem("default", _("Default")), new WarningItem("more", _("More")), new WarningItem("all", _("All")), }; - comboWarnings = new JComboBox(warningItems); - String currentWarningLevel = PreferencesData.get("compiler.warning_level", "none"); - for (WarningItem item : warningItems) { - if (currentWarningLevel.equals(item.getValue())) { - comboWarnings.setSelectedItem(item); - } - } - box.add(comboWarnings); - pane.add(box); - d = box.getPreferredSize(); - box.setForeground(Color.gray); - box.setBounds(left, top, d.width, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Display line numbers - - displayLineNumbersBox = new JCheckBox(_("Display line numbers")); - pane.add(displayLineNumbersBox); - d = displayLineNumbersBox.getPreferredSize(); - displayLineNumbersBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Enable Code Folding - - enableCodeFoldingBox = new JCheckBox(_("Enable Code Folding")); - pane.add(enableCodeFoldingBox); - d = enableCodeFoldingBox.getPreferredSize(); - enableCodeFoldingBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Verify code after upload - - verifyUploadBox = new JCheckBox(_("Verify code after upload")); - pane.add(verifyUploadBox); - d = verifyUploadBox.getPreferredSize(); - verifyUploadBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Use external editor - - externalEditorBox = new JCheckBox(_("Use external editor")); - pane.add(externalEditorBox); - d = externalEditorBox.getPreferredSize(); - externalEditorBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - - // [ ] Check for updates on startup - - checkUpdatesBox = new JCheckBox(_("Check for updates on startup")); - pane.add(checkUpdatesBox); - d = checkUpdatesBox.getPreferredSize(); - checkUpdatesBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Update sketch files to new extension on save (.pde -> .ino) - - updateExtensionBox = new JCheckBox(_("Update sketch files to new extension on save (.pde -> .ino)")); - pane.add(updateExtensionBox); - d = updateExtensionBox.getPreferredSize(); - updateExtensionBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // [ ] Automatically associate .pde files with Processing - - if (OSUtils.isWindows()) { - autoAssociateBox = - new JCheckBox(_("Automatically associate .ino files with Arduino")); - pane.add(autoAssociateBox); - d = autoAssociateBox.getPreferredSize(); - autoAssociateBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // If using portable mode, it's bad manner to change PC setting. - if (Base.getPortableFolder() != null) - autoAssociateBox.setEnabled(false); - } - - // [ ] save when verifying or uploading - - saveVerifyUploadBox = new JCheckBox(_("Save when verifying or uploading")); - pane.add(saveVerifyUploadBox); - d = saveVerifyUploadBox.getPreferredSize(); - saveVerifyUploadBox.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // proxy settings - - JPanel proxySettingsContainer = new JPanel(); - pane.add(proxySettingsContainer); - setupProxySettingsFieldSet(proxySettingsContainer); - d = proxySettingsContainer.getMinimumSize(); - proxySettingsContainer.setBounds(left, top, d.width + 10, d.height); - right = Math.max(right, left + d.width); - top += d.height + GUI_BETWEEN; - - // boards manager additional urls - box = Box.createHorizontalBox(); - label = new JLabel(_("Additional Boards Manager URLs: ")); - box.add(label); - additionalBoardsManagerField = new JTextField(30); - box.add(additionalBoardsManagerField); - JButton extendedAdditionalUrlFieldWindow = new JButton(new ImageIcon(Base.getThemeImage("newwindow.gif", dialog))); - extendedAdditionalUrlFieldWindow.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final AdditionalBoardsManagerURLTextArea additionalBoardsManagerURLTextArea = new AdditionalBoardsManagerURLTextArea(dialog); - additionalBoardsManagerURLTextArea.setText(additionalBoardsManagerField.getText()); - additionalBoardsManagerURLTextArea.onOk(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - additionalBoardsManagerField.setText(additionalBoardsManagerURLTextArea.getText()); - } - }); - additionalBoardsManagerURLTextArea.setVisible(true); - } - }); - box.add(extendedAdditionalUrlFieldWindow); - pane.add(box); - d = box.getPreferredSize(); - box.setBounds(left, top, d.width, d.height); - top += d.height + GUI_BETWEEN; - - // More preferences are in the ... - - label = new JLabel(_("More preferences can be edited directly in the file")); - pane.add(label); - d = label.getPreferredSize(); - label.setForeground(Color.gray); - label.setBounds(left, top, d.width, d.height); - right = Math.max(right, left + d.width); - top += d.height; // + GUI_SMALL; - - label = new JLabel(PreferencesData.preferencesFile.getAbsolutePath()); - final JLabel clickable = label; - label.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - Base.openFolder(PreferencesData.preferencesFile.getParentFile()); - } - - public void mouseEntered(MouseEvent e) { - clickable.setForeground(new Color(0, 0, 140)); - } - - public void mouseExited(MouseEvent e) { - clickable.setForeground(Color.BLACK); - } - }); - pane.add(label); - d = label.getPreferredSize(); - label.setBounds(left, top, d.width, d.height); - right = Math.max(right, left + d.width); - top += d.height; - - label = new JLabel(_("(edit only when Arduino is not running)")); - pane.add(label); - d = label.getPreferredSize(); - label.setForeground(Color.gray); - label.setBounds(left, top, d.width, d.height); - right = Math.max(right, left + d.width); - top += d.height; // + GUI_SMALL; - - - // [ OK ] [ Cancel ] maybe these should be next to the message? - - button = new JButton(I18n.PROMPT_OK); - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - applyFrame(); - disposeFrame(); - } - }); - pane.add(button); - d2 = button.getPreferredSize(); - BUTTON_HEIGHT = d2.height; - - h = right - (BUTTON_WIDTH + GUI_SMALL + BUTTON_WIDTH); - button.setBounds(h, top, BUTTON_WIDTH, BUTTON_HEIGHT); - h += BUTTON_WIDTH + GUI_SMALL; - - button = new JButton(I18n.PROMPT_CANCEL); - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - disposeFrame(); - } - }); - pane.add(button); - button.setBounds(h, top, BUTTON_WIDTH, BUTTON_HEIGHT); - - top += BUTTON_HEIGHT + GUI_BETWEEN; - - - // finish up - - wide = right + GUI_BIG; - high = top + GUI_SMALL; - - - // closing the window is same as hitting cancel button - - dialog.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - disposeFrame(); - } - }); - - ActionListener disposer = new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - disposeFrame(); - } - }; - Base.registerWindowCloseKeys(dialog.getRootPane(), disposer); - Base.setIcon(dialog); - - Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - dialog.setLocation((screen.width - wide) / 2, - (screen.height - high) / 2); - - dialog.pack(); // get insets - Insets insets = dialog.getInsets(); - dialog.setSize(wide + insets.left + insets.right, - high + insets.top + insets.bottom); - - - // handle window closing commands for ctrl/cmd-W or hitting ESC. - - pane.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - //System.out.println(e); - KeyStroke wc = Editor.WINDOW_CLOSE_KEYSTROKE; - if ((e.getKeyCode() == KeyEvent.VK_ESCAPE) || - (KeyStroke.getKeyStrokeForEvent(e).equals(wc))) { - disposeFrame(); - } - } - }); - } - - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void setupProxySettingsFieldSet(Container pane) { - - JPanel proxySettingsPanel = new JPanel(); - - JLabel proxyHTTPServerLabel = new JLabel(); - proxyHTTPServer = new JTextField(); - JLabel proxyHTTPPortLabel = new JLabel(); - proxyHTTPPort = new JTextField(); - JLabel proxyHTTPSServerLabel = new JLabel(); - proxyHTTPSServer = new JTextField(); - JLabel proxyHTTPSPortLabel = new JLabel(); - proxyHTTPSPort = new JTextField(); - JLabel proxyUserLabel = new JLabel(); - proxyUser = new JTextField(); - JLabel proxyPasswordLabel = new JLabel(); - proxyPassword = new JPasswordField(); - - proxySettingsPanel.setBorder(BorderFactory.createTitledBorder(_("Proxy Settings"))); - - proxyHTTPServerLabel.setText(_("Server (HTTP):")); - - proxyHTTPServer.setColumns(10); - - proxyHTTPPortLabel.setText(_("Port (HTTP):")); - - proxyHTTPPort.setColumns(10); - - proxyHTTPSServerLabel.setText(_("Server: (HTTPS)")); - - proxyHTTPSServer.setColumns(10); - - proxyHTTPSPortLabel.setText(_("Port (HTTPS):")); - - proxyHTTPSPort.setColumns(10); - - proxyUserLabel.setText(_("Username:")); - - proxyPasswordLabel.setText(_("Password:")); - - GroupLayout proxySettingsPanelLayout = new GroupLayout(proxySettingsPanel); - proxySettingsPanel.setLayout(proxySettingsPanelLayout); - proxySettingsPanelLayout.setHorizontalGroup( - proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(proxySettingsPanelLayout.createSequentialGroup() - .addContainerGap() - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) - .addComponent(proxyUserLabel) - .addComponent(proxyHTTPSServerLabel) - .addComponent(proxyHTTPServerLabel)) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) - .addComponent(proxyHTTPServer) - .addComponent(proxyHTTPSServer) - .addComponent(proxyUser)) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) - .addComponent(proxyPasswordLabel) - .addComponent(proxyHTTPSPortLabel) - .addComponent(proxyHTTPPortLabel)) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) - .addComponent(proxyPassword) - .addComponent(proxyHTTPSPort) - .addComponent(proxyHTTPPort)) - .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - proxySettingsPanelLayout.setVerticalGroup( - proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(proxySettingsPanelLayout.createSequentialGroup() - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(proxyHTTPServerLabel) - .addComponent(proxyHTTPServer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - .addComponent(proxyHTTPPortLabel) - .addComponent(proxyHTTPPort, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(proxyHTTPSServerLabel) - .addComponent(proxyHTTPSServer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - .addComponent(proxyHTTPSPortLabel) - .addComponent(proxyHTTPSPort, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addGroup(proxySettingsPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(proxyUserLabel) - .addComponent(proxyUser, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - .addComponent(proxyPasswordLabel) - .addComponent(proxyPassword, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) - ); - - GroupLayout layout = new GroupLayout(pane); - pane.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(proxySettingsPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(proxySettingsPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) - ); - - }// //GEN-END:initComponents - // ................................................................. - - - /** - * Close the window after an OK or Cancel. - */ - protected void disposeFrame() { - dialog.dispose(); - } - - - /** - * Change internal settings based on what was chosen in the prefs, - * then send a message to the editor saying that it's time to do the same. - */ - protected void applyFrame() { - // put each of the settings into the table - PreferencesData.setBoolean("build.verbose", verboseCompilationBox.isSelected()); - PreferencesData.setBoolean("upload.verbose", verboseUploadBox.isSelected()); - PreferencesData.setBoolean("editor.linenumbers", displayLineNumbersBox.isSelected()); - PreferencesData.setBoolean("editor.code_folding", enableCodeFoldingBox.isSelected()); - PreferencesData.setBoolean("upload.verify", verifyUploadBox.isSelected()); - PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected()); - -// setBoolean("sketchbook.closing_last_window_quits", -// closingLastQuitsBox.isSelected()); - //setBoolean("sketchbook.prompt", sketchPromptBox.isSelected()); - //setBoolean("sketchbook.auto_clean", sketchCleanBox.isSelected()); - - // if the sketchbook path has changed, rebuild the menus - String oldPath = PreferencesData.get("sketchbook.path"); - String newPath = sketchbookLocationField.getText(); - if (newPath.isEmpty()) { - if (Base.getPortableFolder() == null) - newPath = editor.base.getDefaultSketchbookFolderOrPromptForIt().toString(); - else - newPath = Base.getPortableSketchbookFolder(); - } - if (!newPath.equals(oldPath)) { - editor.base.rebuildSketchbookMenus(); - PreferencesData.set("sketchbook.path", newPath); - } - - PreferencesData.setBoolean("editor.external", externalEditorBox.isSelected()); - PreferencesData.setBoolean("update.check", checkUpdatesBox.isSelected()); - PreferencesData.setBoolean("editor.save_on_verify", saveVerifyUploadBox.isSelected()); - - /* - // was gonna use this to check memory settings, - // but it quickly gets much too messy - if (getBoolean("run.options.memory")) { - Process process = Runtime.getRuntime().exec(new String[] { - "java", "-Xms" + memoryMin + "m", "-Xmx" + memoryMax + "m" - }); - processInput = new SystemOutSiphon(process.getInputStream()); - processError = new MessageSiphon(process.getErrorStream(), this); - } - */ - - String newSizeText = fontSizeField.getText(); - try { - int newSize = Integer.parseInt(newSizeText.trim()); - String pieces[] = PApplet.split(PreferencesData.get("editor.font"), ','); - pieces[2] = String.valueOf(newSize); - PreferencesData.set("editor.font", PApplet.join(pieces, ',')); - - } catch (Exception e) { - System.err.println(I18n.format(_("ignoring invalid font size {0}"), newSizeText)); - } - - if (autoAssociateBox != null) { - PreferencesData.setBoolean("platform.auto_file_type_associations", autoAssociateBox.isSelected()); - } - - PreferencesData.setBoolean("editor.update_extension", updateExtensionBox.isSelected()); - - // adds the selected language to the preferences file - Language newLanguage = (Language) comboLanguage.getSelectedItem(); - PreferencesData.set("editor.languages.current", newLanguage.isoCode); - - WarningItem warningItem = (WarningItem) comboWarnings.getSelectedItem(); - PreferencesData.set("compiler.warning_level", warningItem.getValue()); - - PreferencesData.set("proxy.http.server", proxyHTTPServer.getText()); - try { - PreferencesData.set("proxy.http.port", Integer.valueOf(proxyHTTPPort.getText()).toString()); - } catch (NumberFormatException e) { - PreferencesData.remove("proxy.http.port"); - } - PreferencesData.set("proxy.https.server", proxyHTTPSServer.getText()); - try { - PreferencesData.set("proxy.https.port", Integer.valueOf(proxyHTTPSPort.getText()).toString()); - } catch (NumberFormatException e) { - PreferencesData.remove("proxy.https.port"); - } - PreferencesData.set("proxy.user", proxyUser.getText()); - PreferencesData.set("proxy.password", new String(proxyPassword.getPassword())); - - PreferencesData.set("boardsmanager.additional.urls", additionalBoardsManagerField.getText().replace("\r\n", "\n").replace("\r", "\n").replace("\n", ",")); - - editor.applyPreferences(); - } - - - protected void showFrame(Editor editor) { - this.editor = editor; - - // set all settings entry boxes to their actual status - verboseCompilationBox.setSelected(PreferencesData.getBoolean("build.verbose")); - verboseUploadBox.setSelected(PreferencesData.getBoolean("upload.verbose")); - displayLineNumbersBox.setSelected(PreferencesData.getBoolean("editor.linenumbers")); - enableCodeFoldingBox.setSelected(PreferencesData.getBoolean("editor.code_folding")); - verifyUploadBox.setSelected(PreferencesData.getBoolean("upload.verify")); - - //closingLastQuitsBox. - // setSelected(getBoolean("sketchbook.closing_last_window_quits")); - //sketchPromptBox. - // setSelected(getBoolean("sketchbook.prompt")); - //sketchCleanBox. - // setSelected(getBoolean("sketchbook.auto_clean")); - - sketchbookLocationField.setText(PreferencesData.get("sketchbook.path")); - externalEditorBox.setSelected(PreferencesData.getBoolean("editor.external")); - checkUpdatesBox.setSelected(PreferencesData.getBoolean("update.check")); - saveVerifyUploadBox.setSelected(PreferencesData.getBoolean("editor.save_on_verify")); - - if (autoAssociateBox != null) { - autoAssociateBox.setSelected(PreferencesData.getBoolean("platform.auto_file_type_associations")); - } - - updateExtensionBox.setSelected(PreferencesData.get("editor.update_extension") == null || PreferencesData.getBoolean("editor.update_extension")); - - proxyHTTPServer.setText(PreferencesData.get("proxy.http.server")); - try { - proxyHTTPPort.setText(Integer.toString(PreferencesData.getInteger("proxy.http.port", 8080))); - } catch (NumberFormatException e) { - proxyHTTPPort.setText(""); - } - proxyHTTPSServer.setText(PreferencesData.get("proxy.https.server")); - try { - proxyHTTPSPort.setText(Integer.toString(PreferencesData.getInteger("proxy.https.port", 8443))); - } catch (NumberFormatException e) { - proxyHTTPSPort.setText(""); - } - proxyUser.setText(PreferencesData.get("proxy.user")); - proxyPassword.setText(PreferencesData.get("proxy.password")); - - additionalBoardsManagerField.setText(PreferencesData.get("boardsmanager.additional.urls")); - - dialog.setLocationRelativeTo(editor); - dialog.setVisible(true); - } - @Deprecated protected static void save() { PreferencesData.save(); From 670ad374ef21add02d16fe853330b2d7e0c44c60 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 15 May 2015 16:42:45 +0200 Subject: [PATCH 4/5] New editor on MacOSX: since CMD+J is known as "jump to selection" and the editor has no such feature, CMD+J is disabled on mac. See #3098 --- .../processing/app/syntax/SketchTextAreaDefaultInputMap.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/processing/app/syntax/SketchTextAreaDefaultInputMap.java b/app/src/processing/app/syntax/SketchTextAreaDefaultInputMap.java index bf134b60846..5d806f4c9f9 100644 --- a/app/src/processing/app/syntax/SketchTextAreaDefaultInputMap.java +++ b/app/src/processing/app/syntax/SketchTextAreaDefaultInputMap.java @@ -33,8 +33,11 @@ public SketchTextAreaDefaultInputMap() { if (isOSX) { put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultModifier), SketchTextAreaEditorKit.rtaDeleteLineToCursorAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultModifier), DefaultEditorKit.beginAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultModifier), DefaultEditorKit.endAction); + + remove(KeyStroke.getKeyStroke(KeyEvent.VK_J, defaultModifier)); } } } From d356cf834581ab6cb98f61948ac45dd67cc89507 Mon Sep 17 00:00:00 2001 From: Matthias Hertel Date: Sat, 16 May 2015 20:30:59 +0200 Subject: [PATCH 5/5] Optimizations: remove multiple calls to the status() function. --- libraries/Ethernet/src/EthernetClient.cpp | 11 ++++++++--- libraries/Ethernet/src/EthernetServer.cpp | 13 +++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries/Ethernet/src/EthernetClient.cpp b/libraries/Ethernet/src/EthernetClient.cpp index a592bfdc956..1feed4c424a 100644 --- a/libraries/Ethernet/src/EthernetClient.cpp +++ b/libraries/Ethernet/src/EthernetClient.cpp @@ -131,12 +131,17 @@ void EthernetClient::stop() { disconnect(_sock); unsigned long start = millis(); - // wait a second for the connection to close - while (status() != SnSR::CLOSED && millis() - start < 1000) + // wait up to a second for the connection to close + uint8_t s; + do { + s = status(); + if (s == SnSR::CLOSED) + break; // exit the loop delay(1); + } while (millis() - start < 1000); // if it hasn't closed, close it forcefully - if (status() != SnSR::CLOSED) + if (s != SnSR::CLOSED) close(_sock); EthernetClass::_server_port[_sock] = 0; diff --git a/libraries/Ethernet/src/EthernetServer.cpp b/libraries/Ethernet/src/EthernetServer.cpp index 6d6ce8c8027..cfa813eb7be 100644 --- a/libraries/Ethernet/src/EthernetServer.cpp +++ b/libraries/Ethernet/src/EthernetServer.cpp @@ -54,12 +54,13 @@ EthernetClient EthernetServer::available() for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { EthernetClient client(sock); - if (EthernetClass::_server_port[sock] == _port && - (client.status() == SnSR::ESTABLISHED || - client.status() == SnSR::CLOSE_WAIT)) { - if (client.available()) { - // XXX: don't always pick the lowest numbered socket. - return client; + if (EthernetClass::_server_port[sock] == _port) { + uint8_t s = client.status(); + if (s == SnSR::ESTABLISHED || s == SnSR::CLOSE_WAIT) { + if (client.available()) { + // XXX: don't always pick the lowest numbered socket. + return client; + } } } }