From 47b6fd9200b1b91f2afd4149cc43d645e293c1b3 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Sat, 25 Jun 2016 21:50:09 -0500 Subject: [PATCH] Bug 490191 - Allow changing of Arduino Home directory. Added to Arduino Preferences page. Change-Id: Ibe3e65f87cb613757d9e22ebb96324d43884a8e5 --- .../core/internal/ArduinoPreferences.java | 8 +++- .../core/internal/board/ArduinoManager.java | 13 +++++- .../preferences/ArduinoPreferencePage.java | 41 +++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoPreferences.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoPreferences.java index 988ef26d933..fb532504bc7 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoPreferences.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/ArduinoPreferences.java @@ -39,7 +39,13 @@ public class ArduinoPreferences { } public static void setArduinoHome(Path home) { - getPrefs().put(ARDUINO_HOME, home.toString()); + IEclipsePreferences prefs = getPrefs(); + prefs.put(ARDUINO_HOME, home.toString()); + try { + prefs.flush(); + } catch (BackingStoreException e) { + Activator.log(e); + } } public static String getBoardUrls() { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java index 8d6402c4fa5..15e2ea4c0e5 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java @@ -83,6 +83,7 @@ public class ArduinoManager { private Properties props; + private Path arduinoHome = ArduinoPreferences.getArduinoHome(); private Map packages; private Map installedLibraries; @@ -91,6 +92,14 @@ public class ArduinoManager { } private synchronized void init() throws CoreException { + if (!arduinoHome.equals(ArduinoPreferences.getArduinoHome())) { + // Arduino Home changed, reset. + props = null; + packages = null; + installedLibraries = null; + arduinoHome = ArduinoPreferences.getArduinoHome(); + } + if (props == null) { if (!Files.exists(ArduinoPreferences.getArduinoHome())) { try { @@ -293,8 +302,8 @@ public class ArduinoManager { } private synchronized void initPackages() throws CoreException { + init(); if (packages == null) { - init(); packages = new HashMap<>(); try { @@ -372,7 +381,7 @@ public class ArduinoManager { return pkg != null ? pkg.getTool(toolName, version) : null; } - public void initInstalledLibraries() throws CoreException { + private void initInstalledLibraries() throws CoreException { init(); if (installedLibraries == null) { installedLibraries = new HashMap<>(); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoPreferencePage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoPreferencePage.java index 55414d233e9..07d896e0aea 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoPreferencePage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/preferences/ArduinoPreferencePage.java @@ -10,14 +10,21 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.ui.internal.preferences; +import java.nio.file.Paths; + import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; import org.eclipse.cdt.arduino.ui.internal.Messages; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.DirectoryDialog; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; @@ -25,6 +32,7 @@ import org.eclipse.ui.IWorkbenchPreferencePage; public class ArduinoPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Text urlsText; + private Text homeText; @Override public void init(IWorkbench workbench) { @@ -35,6 +43,33 @@ public class ArduinoPreferencePage extends PreferencePage implements IWorkbenchP Composite control = new Composite(parent, SWT.NONE); control.setLayout(new GridLayout()); + Composite homeComp = new Composite(control, SWT.NONE); + homeComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + homeComp.setLayout(new GridLayout(3, false)); + + Label label = new Label(homeComp, SWT.NONE); + label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); + label.setText("Arduino home:"); + + homeText = new Text(homeComp, SWT.BORDER); + homeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + homeText.setText(ArduinoPreferences.getArduinoHome().toString()); + + Button browse = new Button(homeComp, SWT.NONE); + browse.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + browse.setText("Browse..."); + browse.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + DirectoryDialog dialog = new DirectoryDialog(getShell()); + dialog.setMessage("Select directory for the Arduino SDKs and toolchains."); + String dir = dialog.open(); + if (dir != null) { + homeText.setText(dir); + } + } + }); + Text desc = new Text(control, SWT.READ_ONLY | SWT.WRAP); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false); layoutData.widthHint = 500; @@ -52,14 +87,20 @@ public class ArduinoPreferencePage extends PreferencePage implements IWorkbenchP @Override public boolean performOk() { ArduinoPreferences.setBoardUrls(urlsText.getText()); + ArduinoPreferences.setArduinoHome(Paths.get(homeText.getText())); return true; } @Override protected void performDefaults() { + String defaultHome = ArduinoPreferences.getDefaultArduinoHome(); + homeText.setText(defaultHome); + ArduinoPreferences.setArduinoHome(Paths.get(defaultHome)); + String defaultBoardUrl = ArduinoPreferences.getDefaultBoardUrls(); urlsText.setText(defaultBoardUrl); ArduinoPreferences.setBoardUrls(defaultBoardUrl); + super.performDefaults(); }