diff --git a/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java b/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java index 591705d81..26fe9e461 100644 --- a/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java +++ b/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java @@ -28,6 +28,8 @@ */ package cc.arduino.libraries.contributions.ui; +import static processing.app.I18n._; + import java.awt.Dialog; import java.awt.Frame; import java.util.Collection; @@ -133,13 +135,13 @@ public class LibraryManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, ""); installer.updateIndex(); onIndexesUpdated(); } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); @@ -151,13 +153,13 @@ public class LibraryManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, _("Installing...")); installer.install(lib); getContribModel().updateLibrary(lib); } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); @@ -169,13 +171,13 @@ public class LibraryManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, _("Removing...")); installer.remove(lib); getContribModel().updateLibrary(lib); } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); diff --git a/app/src/cc/arduino/packages/contributions/ui/ContributedPlatformTableCell.java b/app/src/cc/arduino/packages/contributions/ui/ContributedPlatformTableCell.java index ebb26226f..41ec42995 100644 --- a/app/src/cc/arduino/packages/contributions/ui/ContributedPlatformTableCell.java +++ b/app/src/cc/arduino/packages/contributions/ui/ContributedPlatformTableCell.java @@ -33,17 +33,21 @@ import static processing.app.I18n.format; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextPane; +import javax.swing.Timer; import javax.swing.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; @@ -62,9 +66,16 @@ public class ContributedPlatformTableCell extends InstallerTableCell { private JPanel panel; private JTextPane description; + + private JPanel buttonsPanel; private JButton installButton; + private JComboBox downgradeChooser; + private JButton downgradeButton; private JButton removeButton; - private Component removeButtonPlaceholder; + private Component removeButtonStrut; + + private JPanel inactiveButtonsPanel; + private JLabel statusLabel; public ContributedPlatformTableCell() { description = new JTextPane(); @@ -110,19 +121,74 @@ public class ContributedPlatformTableCell extends InstallerTableCell { } }); - int width = removeButton.getPreferredSize().width; - removeButtonPlaceholder = Box.createRigidArea(new Dimension(width, 1)); + downgradeButton = new JButton(_("Install")); + downgradeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ContributedPlatform selected; + selected = (ContributedPlatform) downgradeChooser.getSelectedItem(); + onInstall(selected, editorValue.getInstalled()); + } + }); + downgradeChooser = new JComboBox(); + downgradeChooser.addItem("-"); + downgradeChooser.setMaximumSize(downgradeChooser.getPreferredSize()); + downgradeChooser.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Object selectVersionItem = downgradeChooser.getItemAt(0); + boolean disableDowngrade = (e.getItem() == selectVersionItem); + downgradeButton.setEnabled(!disableDowngrade); + } + }); + panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(description); - panel.add(Box.createHorizontalStrut(5)); - panel.add(installButton); - panel.add(Box.createHorizontalStrut(5)); - panel.add(removeButton); - panel.add(removeButtonPlaceholder); - panel.add(Box.createHorizontalStrut(5)); + + { + buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); + buttonsPanel.setOpaque(false); + + buttonsPanel.add(Box.createHorizontalStrut(20)); + buttonsPanel.add(downgradeChooser); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(downgradeButton); + buttonsPanel.add(Box.createHorizontalGlue()); + + buttonsPanel.add(installButton); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(removeButton); + removeButtonStrut = Box.createHorizontalStrut(5); + buttonsPanel.add(removeButtonStrut); + buttonsPanel.add(Box.createHorizontalStrut(15)); + + panel.add(buttonsPanel); + } + + { + inactiveButtonsPanel = new JPanel(); + inactiveButtonsPanel.setLayout(new BoxLayout(inactiveButtonsPanel, + BoxLayout.X_AXIS)); + inactiveButtonsPanel.setOpaque(false); + + int h = installButton.getMinimumSize().height; + inactiveButtonsPanel.add(Box.createVerticalStrut(h)); + inactiveButtonsPanel.add(Box.createGlue()); + + statusLabel = new JLabel(" "); + inactiveButtonsPanel.add(statusLabel); + + inactiveButtonsPanel.add(Box.createGlue()); + inactiveButtonsPanel.add(Box.createVerticalStrut(h)); + + panel.add(inactiveButtonsPanel); + } + + panel.add(Box.createVerticalStrut(10)); } protected void onRemove(ContributedPlatform contributedPlatform) { @@ -138,6 +204,8 @@ public class ContributedPlatformTableCell extends InstallerTableCell { boolean hasFocus, int row, int column) { parentTable = table; + setEnabled(false); + Component panel = getUpdatedCellComponent(value, isSelected, row); return panel; } @@ -156,6 +224,20 @@ public class ContributedPlatformTableCell extends InstallerTableCell { int column) { parentTable = table; editorValue = (ContributedPlatformReleases) value; + setEnabled(true); + + downgradeChooser.removeAllItems(); + downgradeChooser.addItem(_("Select version")); + boolean visible = false; + for (ContributedPlatform release : editorValue.releases) { + if (release.isInstalled()) + continue; + downgradeChooser.addItem(release); + visible = true; + } + downgradeChooser.setVisible(visible); + downgradeButton.setVisible(visible); + return getUpdatedCellComponent(value, true, row); } @@ -183,30 +265,24 @@ public class ContributedPlatformTableCell extends InstallerTableCell { installButton.setVisible(installable || upgradable); removeButton.setVisible(removable); - removeButtonPlaceholder.setVisible(!removable); + removeButtonStrut.setVisible(removable); String desc = ""; desc += "" + selectedPlatform.getName() + ""; String author = selectedPlatform.getParentPackage().getMaintainer(); String url = selectedPlatform.getParentPackage().getWebsiteURL(); if (author != null && !author.isEmpty()) { - desc += format(" by {1}", url, author); + desc += " " + format("by {1}", url, author); + } + if (removable) { + desc += " " + format(_("version {0}"), installedPlatform.getVersion()); } - desc += "
"; desc += "
"; - desc += _("Boards contributed in this package:") + "
"; + desc += _("Boards included in this package:") + "
"; for (ContributedBoard board : selectedPlatform.getBoards()) - desc += format("- {0}
", board.getName()); - desc += "
"; - desc += format(_("Available version: {0}"), - selectedPlatform.getVersion()); - desc += "
"; - if (removable) { - desc += format(_("Installed version: {0}"), - installedPlatform.getVersion()); - } - desc += "
"; + desc += format("{0}, ", board.getName()); + desc = desc.substring(0, desc.lastIndexOf(',')) + ".
"; desc += ""; description.setText(desc); description.setBackground(Color.WHITE); @@ -222,12 +298,33 @@ public class ContributedPlatformTableCell extends InstallerTableCell { return panel; } + private Timer enabler = new Timer(100, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + enable(true); + enabler.stop(); + } + }); + @Override public void setEnabled(boolean enabled) { + enable(false); + if (enabled) { + enabler.start(); + } + buttonsPanel.setVisible(enabled); + inactiveButtonsPanel.setVisible(!enabled); + } + + private void enable(boolean enabled) { installButton.setEnabled(enabled); removeButton.setEnabled(enabled); } + public void setStatus(String status) { + statusLabel.setText(status); + } + public void invalidate() { panel.invalidate(); } diff --git a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java index ad7de79c3..3a8bd22f1 100644 --- a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java +++ b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java @@ -28,6 +28,7 @@ */ package cc.arduino.packages.contributions.ui; +import static processing.app.I18n._; import cc.arduino.packages.contributions.ContributedPlatform; import cc.arduino.packages.contributions.ContributionInstaller; import cc.arduino.packages.contributions.ContributionsIndexer; @@ -132,13 +133,13 @@ public class ContributionManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, ""); installer.updateIndex(); onIndexesUpdated(); } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); @@ -151,7 +152,7 @@ public class ContributionManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, _("Installing...")); installer.install(platformToInstall); if (platformToRemove != null) { installer.remove(platformToRemove); @@ -159,7 +160,7 @@ public class ContributionManagerUI extends InstallerJDialog { } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); @@ -172,12 +173,12 @@ public class ContributionManagerUI extends InstallerJDialog { @Override public void run() { try { - setProgressVisible(true); + setProgressVisible(true, _("Removing...")); installer.remove(platform); } catch (Exception e) { throw new RuntimeException(e); } finally { - setProgressVisible(false); + setProgressVisible(false, ""); } } }); diff --git a/app/src/cc/arduino/ui/InstallerJDialog.java b/app/src/cc/arduino/ui/InstallerJDialog.java index ae568f019..4d93cbdb5 100644 --- a/app/src/cc/arduino/ui/InstallerJDialog.java +++ b/app/src/cc/arduino/ui/InstallerJDialog.java @@ -205,7 +205,7 @@ public abstract class InstallerJDialog extends JDialog { progressPanel.add(updateBox); pane.add(progressPanel, BorderLayout.SOUTH); } - setProgressVisible(false); + setProgressVisible(false, ""); setMinimumSize(new Dimension(600, 450)); @@ -219,7 +219,7 @@ public abstract class InstallerJDialog extends JDialog { }); } - public void setProgressVisible(boolean visible) { + public void setProgressVisible(boolean visible, String status) { progressBox.setVisible(visible); filterField.setEnabled(!visible); @@ -228,7 +228,8 @@ public abstract class InstallerJDialog extends JDialog { updateBox.setVisible(!visible); updateBox.setEnabled(!visible); cellEditor.setEnabled(!visible); - + cellEditor.setStatus(status); + if (visible && contribTable.isEditing()) { TableCellEditor editor = contribTable.getCellEditor(); if (editor != null) diff --git a/app/src/cc/arduino/ui/InstallerTableCell.java b/app/src/cc/arduino/ui/InstallerTableCell.java index b400aa687..57e49b34b 100644 --- a/app/src/cc/arduino/ui/InstallerTableCell.java +++ b/app/src/cc/arduino/ui/InstallerTableCell.java @@ -39,4 +39,8 @@ public abstract class InstallerTableCell extends AbstractCellEditor implements // Empty } + public void setStatus(String s) { + // Empty + } + } diff --git a/arduino-core/src/cc/arduino/packages/contributions/ContributedPlatform.java b/arduino-core/src/cc/arduino/packages/contributions/ContributedPlatform.java index 3ace92ba6..3462eb556 100644 --- a/arduino-core/src/cc/arduino/packages/contributions/ContributedPlatform.java +++ b/arduino-core/src/cc/arduino/packages/contributions/ContributedPlatform.java @@ -87,4 +87,8 @@ public abstract class ContributedPlatform extends DownloadableContribution { this.parentPackage = parentPackage; } + @Override + public String toString() { + return getVersion(); + } }