From bd0600a625c65c103654b55dff4e834a0b1fe07b Mon Sep 17 00:00:00 2001 From: pesckal Date: Mon, 18 Jul 2011 04:57:46 +0000 Subject: [PATCH] Automatically check for updates to contributions in the background. --- app/src/processing/app/Base.java | 14 +- app/src/processing/app/Contribution.java | 10 +- .../processing/app/ContributionListPanel.java | 34 ++--- .../processing/app/ContributionListing.java | 36 +++-- .../processing/app/ContributionManager.java | 123 +++++++++--------- app/src/processing/app/UpdateCheck.java | 25 ++++ 6 files changed, 135 insertions(+), 107 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index d522b9094..cacfe8f33 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -53,7 +53,7 @@ public class Base { /** True if heavy debugging error/log messages are enabled */ static public boolean DEBUG = false; // static public boolean DEBUG = true; - static public boolean ENABLE_LIBRARY_MANAGER = true; + static public boolean ENABLE_LIBRARY_MANAGER = false; static HashMap platformNames = new HashMap(); @@ -1404,16 +1404,22 @@ public class Base { * Show the library installer window. */ public void handleAddOrRemoveLibrary() { - if (libraryManagerFrame == null) libraryManagerFrame = new ContributionManager(); + if (libraryManagerFrame == null) libraryManagerFrame = new ContributionManager(activeEditor); libraryManagerFrame.showFrame(activeEditor); } - + + public void handleShowUpdates() { + if (libraryManagerFrame == null) libraryManagerFrame = new ContributionManager(activeEditor); + libraryManagerFrame.showFrame(activeEditor); + libraryManagerFrame.setFilterText("has:updates"); + } + /** * Installed the libraries in the given file after a confirmation from the * user. Returns the number of libraries installed. */ public boolean handleConfirmAndInstallLibrary(File libFile) { - if (libraryManagerFrame == null) libraryManagerFrame = new ContributionManager(); + if (libraryManagerFrame == null) libraryManagerFrame = new ContributionManager(activeEditor); return libraryManagerFrame.confirmAndInstallLibrary(activeEditor, libFile) != null; } diff --git a/app/src/processing/app/Contribution.java b/app/src/processing/app/Contribution.java index b54753126..4fdfd8da9 100644 --- a/app/src/processing/app/Contribution.java +++ b/app/src/processing/app/Contribution.java @@ -57,7 +57,7 @@ public abstract class Contribution { protected String link = ""; - protected ContributionInfo latestVersion; + protected ContributionInfo advertisedVersion; public static class Author { public String name; @@ -84,8 +84,12 @@ public abstract class Contribution { */ public abstract Contribution getContribution(); - public void setLatestVersion(ContributionInfo advertisedInfo) { - latestVersion = advertisedInfo; + public void setAdvertisedVersion(ContributionInfo advertisedInfo) { + advertisedVersion = advertisedInfo; + } + + public boolean hasUpdates() { + return advertisedVersion != null && advertisedVersion.version > version; } } diff --git a/app/src/processing/app/ContributionListPanel.java b/app/src/processing/app/ContributionListPanel.java index 7b7f9f2b4..bdfaf4a3f 100644 --- a/app/src/processing/app/ContributionListPanel.java +++ b/app/src/processing/app/ContributionListPanel.java @@ -74,7 +74,7 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib private ContributionInstaller compilationInstaller; - public ContributionListPanel(ContributionManager libraryManager, ContributionListing libraryListing) { + public ContributionListPanel(ContributionManager libraryManager) { super(); this.contributionManager = libraryManager; @@ -117,24 +117,17 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib requestFocusInWindow(); } }); + + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.CENTER; - if (libraryListing == null) { - GridBagConstraints c = new GridBagConstraints(); - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.CENTER; - - setupProgressBar = new JProgressBar(); - setupProgressBar.setString(""); - setupProgressBar.setStringPainted(true); - add(setupProgressBar, c); - } else { - // Add all the libraries in libraryListing to this panel - for (ContributionInfo info : libraryListing.getAllLibararies()) { - contributionAdded(info); - } - } + setupProgressBar = new JProgressBar(); + setupProgressBar.setString(""); + setupProgressBar.setStringPainted(true); + add(setupProgressBar, c); } @@ -502,7 +495,7 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { if (okayToOpenHyperLink) { if (UPDATE_LINK.equals(e.getURL().toString())) { - installContribution(info.latestVersion.link); + installContribution(info.advertisedVersion.link); } else { Base.openURL(e.getURL().toString()); } @@ -609,8 +602,7 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib versionText.append("Version "); versionText.append(info.prettyVersion); versionText.append(" installed."); - if (info.latestVersion != null - && info.latestVersion.version > info.version) { + if (info.hasUpdates()) { versionText.append(" "); diff --git a/app/src/processing/app/ContributionListing.java b/app/src/processing/app/ContributionListing.java index 6b6217160..bb8426a27 100644 --- a/app/src/processing/app/ContributionListing.java +++ b/app/src/processing/app/ContributionListing.java @@ -76,7 +76,7 @@ public class ContributionListing { ContributionInfo advertised = getAdvertisedContribution(contribution.name, contribution.getType()); - contribution.setLatestVersion(advertised); + contribution.setAdvertisedVersion(advertised); if (advertised != null) { // Merge information from the advertised and local versions. @@ -181,8 +181,7 @@ public class ContributionListing { return null; } - - + public Set getCategories() { return librariesByCategory.keySet(); } @@ -224,7 +223,7 @@ public class ContributionListing { // Maybe this can be fancy some other time if (filter.equals("has:update") || filter.equals("has:updates")) { - return info.latestVersion != null; + return info.hasUpdates(); } if (filter.equals("is:installed")) { return info.isInstalled(); @@ -286,6 +285,13 @@ public class ContributionListing { return new ArrayList(listeners); } + public void getAdvertisedContributions(ProgressMonitor pm) { + + final ContributionListFetcher llf = new ContributionListFetcher(); + llf.setProgressMonitor(pm); + new Thread(llf).start(); + } + public static interface ContributionChangeListener { public void contributionAdded(ContributionInfo ContributionInfo); @@ -296,9 +302,7 @@ public class ContributionListing { } - public static class ContributionListFetcher implements Runnable { - - ContributionListing libListing; + public class ContributionListFetcher implements Runnable { File dest; @@ -310,9 +314,7 @@ public class ContributionListing { ProgressMonitor progressMonitor; - public ContributionListFetcher(ContributionListing libListing) { - - this.libListing = libListing; + public ContributionListFetcher() { progressMonitor = new NullProgressMonitor(); @@ -341,7 +343,7 @@ public class ContributionListing { File xmlFile = downloader.getFile(); if (xmlFile != null) { - libListing.setAdvertisedList(xmlFile); + setAdvertisedList(xmlFile); } } }); @@ -349,9 +351,6 @@ public class ContributionListing { downloader.run(); } - public ContributionListing getContributionListing() { - return libListing; - } } /** @@ -478,4 +477,13 @@ public class ContributionListing { } } + public boolean hasUpdates() { + for (ContributionInfo info : allLibraries) { + if (info.hasUpdates()) { + return true; + } + } + return false; + } + } diff --git a/app/src/processing/app/ContributionManager.java b/app/src/processing/app/ContributionManager.java index d3b5cf176..da90e8c90 100644 --- a/app/src/processing/app/ContributionManager.java +++ b/app/src/processing/app/ContributionManager.java @@ -36,7 +36,6 @@ import javax.swing.*; import javax.swing.event.*; import processing.app.Contribution.ContributionInfo; -import processing.app.ContributionListing.ContributionListFetcher; public class ContributionManager { @@ -75,9 +74,12 @@ public class ContributionManager { String category; ContributionListing contributionListing; - - public ContributionManager() { + private boolean hasBeenShow; + + public ContributionManager(Editor editor) { + + this.editor = editor; dialog = new JFrame("Contribution Manager"); Base.setIcon(dialog); @@ -111,11 +113,23 @@ public class ContributionManager { pane.add(filterField, c); - contributionListPanel = new ContributionListPanel(this, contributionListing); - if (contributionListing == null) { - JProgressBar progressBar = contributionListPanel.getSetupProgressBar(); - getContributionListing(progressBar); - } + contributionListing = new ContributionListing(); + contributionListPanel = new ContributionListPanel(this); + contributionListing.addContributionListener(contributionListPanel); + + JProgressBar progressBar = contributionListPanel.getSetupProgressBar(); + contributionListing.getAdvertisedContributions(new JProgressMonitor(progressBar) { + + @Override + public void finishedAction() { + synchronized (contributionListing) { + updateContributionListing(); + updateCategoryChooser(); + + progressBar.setVisible(false); + } + } + }); c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; @@ -167,15 +181,10 @@ public class ContributionManager { private void updateCategoryChooser() { ArrayList categories; - if (contributionListing != null) { - categoryChooser.removeAllItems(); - categories = new ArrayList(contributionListing.getCategories()); - Collections.sort(categories); - categories.add(0, ANY_CATEGORY); - } else { - categories = new ArrayList(); - categories.add(0, ANY_CATEGORY); - } + categoryChooser.removeAllItems(); + categories = new ArrayList(contributionListing.getCategories()); + Collections.sort(categories); + categories.add(0, ANY_CATEGORY); for (String s : categories) { categoryChooser.addItem(s); } @@ -210,6 +219,7 @@ public class ContributionManager { protected void showFrame(Editor editor) { this.editor = editor; + hasBeenShow = true; dialog.setVisible(true); } @@ -220,45 +230,16 @@ public class ContributionManager { dialog.dispose(); } - /** - * @return true if the library listing has already been downloaded - */ - public boolean hasContributionListing() { - return contributionListing != null; + public boolean hasBeenShow() { + return hasBeenShow; } - + public void filterLibraries(String category, List filters) { - if (contributionListing != null) { + List filteredLibraries = contributionListing + .getFilteredLibraryList(category, filters); - List filteredLibraries = contributionListing - .getFilteredLibraryList(category, filters); - - contributionListPanel.filterLibraries(filteredLibraries); - } - } - - private void getContributionListing(JProgressBar progressBar) { - if (contributionListing == null) { - contributionListing = new ContributionListing(); - contributionListing.addContributionListener(contributionListPanel); - - final ContributionListFetcher llf = new ContributionListFetcher(contributionListing); - llf.setProgressMonitor(new JProgressMonitor(progressBar) { - - @Override - public void finishedAction() { - contributionListing = llf.getContributionListing(); - synchronized (contributionListing) { - updateContributionListing(); - updateCategoryChooser(); - - progressBar.setVisible(false); - } - } - }); - new Thread(llf).start(); - } + contributionListPanel.filterLibraries(filteredLibraries); } protected void updateContributionListing() { @@ -702,6 +683,18 @@ public class ContributionManager { out.close(); } + public void setFilterText(String filter) { + if (filter == null || filter.isEmpty()) { + filterField.setText(""); + filterField.isShowingHint = true; + } else { + filterField.setText(filter); + filterField.isShowingHint = false; + } + filterField.applyFilter(); + + } + class FilterField extends JTextField { final static String filterHint = "Filter your search..."; @@ -740,29 +733,29 @@ public class ContributionManager { getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { - filter(); + applyFilter(); } public void insertUpdate(DocumentEvent e) { - filter(); + applyFilter(); } public void changedUpdate(DocumentEvent e) { - filter(); - } - - void filter() { - String filter = filterField.getFilterText(); - filter = filter.toLowerCase(); - - // Replace anything but 0-9, a-z, or : with a space - filter = filter.replaceAll("[^\\x30-\\x39^\\x61-\\x7a^\\x3a]", " "); - filters = Arrays.asList(filter.split(" ")); - filterLibraries(category, filters); + applyFilter(); } }); } + public void applyFilter() { + String filter = filterField.getFilterText(); + filter = filter.toLowerCase(); + + // Replace anything but 0-9, a-z, or : with a space + filter = filter.replaceAll("[^\\x30-\\x39^\\x61-\\x7a^\\x3a]", " "); + filters = Arrays.asList(filter.split(" ")); + filterLibraries(category, filters); + } + public String getFilterText() { return isShowingHint ? "" : getText(); } diff --git a/app/src/processing/app/UpdateCheck.java b/app/src/processing/app/UpdateCheck.java index f4cf84c95..d05726355 100644 --- a/app/src/processing/app/UpdateCheck.java +++ b/app/src/processing/app/UpdateCheck.java @@ -114,6 +114,10 @@ public class UpdateCheck { "A new version of Processing is available,\n" + "would you like to visit the Processing download page?"; + String contributionPrompt = + "There are updates available for some of the installed contributions,\n" + + "would you like to open the the Contribution Manager now?"; + if (base.activeEditor != null) { if (latest > Base.REVISION) { Object[] options = { "Yes", "No" }; @@ -128,6 +132,27 @@ public class UpdateCheck { if (result == JOptionPane.YES_OPTION) { Base.openURL("http://processing.org/download/"); } + } else { + if (base.libraryManagerFrame == null) + base.libraryManagerFrame = new ContributionManager(base.getActiveEditor()); + + Thread.sleep(5 * 1000); + if (!base.libraryManagerFrame.hasBeenShow() && + base.libraryManagerFrame.contributionListing.hasUpdates()) { + + Object[] options = { "Yes", "No" }; + int result = JOptionPane.showOptionDialog(base.activeEditor, + contributionPrompt, + "Update", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[0]); + if (result == JOptionPane.YES_OPTION) { + base.handleShowUpdates(); + } + } } } }