diff --git a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java index 5d96b05af..30582b154 100644 --- a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java +++ b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java @@ -91,7 +91,7 @@ public class ContributionManagerUI extends JDialog { private String category; private String[] filters; - public ContributionManagerUI(Frame parent, ContributionsIndexer indexer) { + public ContributionManagerUI(Frame parent) { super(parent, "Boards Manager", Dialog.ModalityType.APPLICATION_MODAL); setResizable(true); @@ -238,7 +238,9 @@ public class ContributionManagerUI extends JDialog { }); } }); + } + public void setIndexer(ContributionsIndexer indexer) { contribModel.setIndex(indexer.getIndex()); setCategories(indexer.getIndex().getCategories()); @@ -305,11 +307,6 @@ public class ContributionManagerUI extends JDialog { progressBar.setString(text); } - public void onUpdatePressed() { - // TODO Auto-generated method stub - System.out.println("Update pressed"); - } - /* * Installer methods follows */ @@ -322,6 +319,25 @@ public class ContributionManagerUI extends JDialog { installerThread.interrupt(); } + public void onUpdatePressed() { + installerThread = new Thread(new Runnable() { + @Override + public void run() { + try { + setProgressVisible(true); + installer.updateIndex(); + onIndexesUpdated(); + } catch (Exception e) { + // TODO Show ERROR + e.printStackTrace(); + } finally { + setProgressVisible(false); + } + } + }); + installerThread.start(); + } + public void onInstallPressed(final ContributedPlatform platform) { installerThread = new Thread(new Runnable() { @Override @@ -358,4 +374,8 @@ public class ContributionManagerUI extends JDialog { installerThread.start(); } + protected void onIndexesUpdated() throws Exception { + // Empty + } + } diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index c1a191398..7aced028e 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1110,7 +1110,15 @@ public class Base { private void openInstallBoardDialog() { // Create dialog for contribution manager - ContributionManagerUI managerUI = new ContributionManagerUI(activeEditor, BaseNoGui.indexer); + @SuppressWarnings("serial") + ContributionManagerUI managerUI = new ContributionManagerUI(activeEditor) { + @Override + protected void onIndexesUpdated() throws Exception { + BaseNoGui.reloadAllHardware(); + setIndexer(BaseNoGui.indexer); + } + }; + managerUI.setIndexer(BaseNoGui.indexer); managerUI.setVisible(true); } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 1450878fd..852ae0bc1 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -2769,12 +2769,14 @@ public class Editor extends JFrame implements RunnerListener { protected void onBoardOrPortChange() { Map boardPreferences = Base.getBoardPreferences(); - lineStatus.setBoardName(boardPreferences.get("name")); + if (boardPreferences != null) + lineStatus.setBoardName(boardPreferences.get("name")); + else + lineStatus.setBoardName("-"); lineStatus.setSerialPort(Preferences.get("serial.port")); lineStatus.repaint(); } - /** * Returns the edit popup menu. */ diff --git a/arduino-core/src/cc/arduino/packages/contributions/ContributionInstaller.java b/arduino-core/src/cc/arduino/packages/contributions/ContributionInstaller.java index 8d26d1c38..23d60dfff 100644 --- a/arduino-core/src/cc/arduino/packages/contributions/ContributionInstaller.java +++ b/arduino-core/src/cc/arduino/packages/contributions/ContributionInstaller.java @@ -234,4 +234,39 @@ public class ContributionInstaller { } } } + + public void updateIndex() throws Exception { + final String statusText = _("Downloading platforms index..."); + updateProgress(0, statusText); + + URL url = new URL("http://arduino.cc/package_index.json"); + File tmpFile = File.createTempFile("package_index", ".json"); + FileDownloader downloader = new FileDownloader(url, tmpFile); + downloader.addObserver(new Observer() { + @Override + public void update(Observable o, Object arg) { + FileDownloader me = (FileDownloader) o; + String msg = ""; + if (me.getDownloadSize() != null) { + long downloaded = me.getInitialSize() + me.getDownloaded() / 1000; + long total = me.getInitialSize() + me.getDownloadSize() / 1000; + msg = format(_("Downloaded {0}kb of {1}kb."), downloaded, total); + } + updateProgress((int) progress + progressStepsDelta * me.getProgress() / + 100.0, statusText + " " + msg); + } + }); + downloader.download(); + if (!downloader.isCompleted()) + throw new Exception("Error dowloading " + url, downloader.getError()); + + // TODO: Check downloaded index + + // Replace old index with the updated one + File outputFile = indexer.getIndexFile(); + if (outputFile.exists()) + outputFile.delete(); + if (!tmpFile.renameTo(outputFile)) + throw new Exception("An error occurred while updating platforms index!"); + } } diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index 6bd4dc1fe..41cfc815e 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -5,6 +5,7 @@ import static processing.app.I18n._; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; @@ -19,6 +20,7 @@ import cc.arduino.packages.DiscoveryManager; import cc.arduino.packages.Uploader; import processing.app.debug.Compiler; import cc.arduino.packages.contributions.ContributionsIndexer; +import cc.arduino.utils.ArchiveExtractor; import processing.app.debug.TargetBoard; import processing.app.debug.LegacyTargetPackage; import processing.app.debug.TargetPackage; @@ -585,14 +587,34 @@ public class BaseNoGui { } static public void initPackages() throws Exception { + reloadAllHardware(); + } + + static public void reloadAllHardware() throws Exception { indexer = new ContributionsIndexer(BaseNoGui.getSettingsFolder()); - if (!indexer.getIndexFile().isFile()) - // TODO: run first setup - ; + File indexFile = indexer.getIndexFile(); + if (!indexFile.isFile()) { + try { + File distFile = getContentFile("dist/default_package.tar.bz2"); + if (distFile.isFile()) { + // If present, unpack distribution file into preferences folder + ArchiveExtractor.extract(distFile, BaseNoGui.getSettingsFolder(), 1); + + // TODO: The first distribution file may be removed after extraction? + } else { + // Otherwise create an empty packages index + FileOutputStream out = new FileOutputStream(indexFile); + out.write("{ \"packages\" : [ ] }".getBytes()); + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } indexer.parseIndex(); indexer.syncWithFilesystem(); System.out.println(indexer); - + packages = new HashMap(); loadHardware(getHardwareFolder()); loadHardware(getSketchbookHardwareFolder());