diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCell.java b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCell.java index 04dc4d8f2..00dd772e9 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCell.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCell.java @@ -29,69 +29,64 @@ package cc.arduino.contributions.packages.ui; -import cc.arduino.contributions.DownloadableContributionVersionComparator; -import cc.arduino.contributions.VersionComparator; -import cc.arduino.contributions.filters.BuiltInPredicate; -import cc.arduino.contributions.filters.InstalledPredicate; -import cc.arduino.contributions.packages.ContributedBoard; -import cc.arduino.contributions.packages.ContributedHelp; -import cc.arduino.contributions.packages.ContributedPlatform; -import cc.arduino.contributions.ui.InstallerTableCell; -import cc.arduino.contributions.ui.listeners.DelegatingKeyListener; -import cc.arduino.utils.ReverseComparator; -import processing.app.Base; +import static processing.app.I18n.format; +import static processing.app.I18n.tr; -import javax.swing.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Insets; + +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.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.text.Document; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.StyleSheet; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Collections; -import java.util.LinkedList; -import java.util.stream.Collectors; -import static processing.app.I18n.format; -import static processing.app.I18n.tr; +import cc.arduino.contributions.DownloadableContributionVersionComparator; +import cc.arduino.contributions.packages.ContributedBoard; +import cc.arduino.contributions.packages.ContributedHelp; +import cc.arduino.contributions.packages.ContributedPlatform; +import cc.arduino.contributions.ui.InstallerTableCell; +import processing.app.Base; @SuppressWarnings("serial") -public class ContributedPlatformTableCell extends InstallerTableCell { +public class ContributedPlatformTableCell { - private final JPanel panel; - private final JButton installButton; - private final JButton removeButton; - private final Component removeButtonPlaceholder; - private final Component installButtonPlaceholder; - private JComboBox downgradeChooser; - private final JComboBox versionToInstallChooser; - private final JButton downgradeButton; - private final JPanel buttonsPanel; - private final JPanel inactiveButtonsPanel; - private final JLabel statusLabel; + final JPanel panel; + final JButton installButton; + final JButton removeButton; + final Component removeButtonPlaceholder; + final Component installButtonPlaceholder; + JComboBox downgradeChooser; + final JComboBox versionToInstallChooser; + final JButton downgradeButton; + final JPanel buttonsPanel; + final JPanel inactiveButtonsPanel; + final JLabel statusLabel; public ContributedPlatformTableCell() { { installButton = new JButton(tr("Install")); - installButton.addActionListener(e -> onInstall(editorValue.getSelected(), editorValue.getInstalled())); int width = installButton.getPreferredSize().width; installButtonPlaceholder = Box.createRigidArea(new Dimension(width, 1)); } { removeButton = new JButton(tr("Remove")); - removeButton.addActionListener(e -> onRemove(editorValue.getInstalled())); int width = removeButton.getPreferredSize().width; removeButtonPlaceholder = Box.createRigidArea(new Dimension(width, 1)); } downgradeButton = new JButton(tr("Install")); - downgradeButton.addActionListener(e -> { - ContributedPlatform selected = (ContributedPlatform) downgradeChooser.getSelectedItem(); - onInstall(selected, editorValue.getInstalled()); - }); downgradeChooser = new JComboBox(); downgradeChooser.addItem("-"); @@ -104,183 +99,62 @@ public class ContributedPlatformTableCell extends InstallerTableCell { versionToInstallChooser = new JComboBox(); versionToInstallChooser.addItem("-"); - versionToInstallChooser.setMaximumSize(versionToInstallChooser.getPreferredSize()); - versionToInstallChooser.addItemListener(e -> editorValue.select((ContributedPlatform) versionToInstallChooser.getSelectedItem())); + versionToInstallChooser + .setMaximumSize(versionToInstallChooser.getPreferredSize()); panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); makeNewDescription(panel); - { - buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); - buttonsPanel.setOpaque(false); + buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); + buttonsPanel.setOpaque(false); - buttonsPanel.add(Box.createHorizontalStrut(7)); - buttonsPanel.add(downgradeChooser); - buttonsPanel.add(Box.createHorizontalStrut(5)); - buttonsPanel.add(downgradeButton); + buttonsPanel.add(Box.createHorizontalStrut(7)); + buttonsPanel.add(downgradeChooser); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(downgradeButton); - buttonsPanel.add(Box.createHorizontalGlue()); + buttonsPanel.add(Box.createHorizontalGlue()); - buttonsPanel.add(versionToInstallChooser); - buttonsPanel.add(Box.createHorizontalStrut(5)); - buttonsPanel.add(installButton); - buttonsPanel.add(Box.createHorizontalStrut(5)); - buttonsPanel.add(removeButton); - buttonsPanel.add(Box.createHorizontalStrut(5)); - buttonsPanel.add(Box.createHorizontalStrut(15)); + buttonsPanel.add(versionToInstallChooser); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(installButton); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(removeButton); + buttonsPanel.add(Box.createHorizontalStrut(5)); + buttonsPanel.add(Box.createHorizontalStrut(15)); - panel.add(buttonsPanel); - } + panel.add(buttonsPanel); - { - inactiveButtonsPanel = new JPanel(); - inactiveButtonsPanel.setLayout(new BoxLayout(inactiveButtonsPanel, BoxLayout.X_AXIS)); - inactiveButtonsPanel.setOpaque(false); + inactiveButtonsPanel = new JPanel(); + inactiveButtonsPanel + .setLayout(new BoxLayout(inactiveButtonsPanel, BoxLayout.X_AXIS)); + inactiveButtonsPanel.setOpaque(false); - int height = installButton.getMinimumSize().height; - inactiveButtonsPanel.add(Box.createVerticalStrut(height)); - inactiveButtonsPanel.add(Box.createGlue()); + int height = installButton.getMinimumSize().height; + inactiveButtonsPanel.add(Box.createVerticalStrut(height)); + inactiveButtonsPanel.add(Box.createGlue()); - statusLabel = new JLabel(" "); - inactiveButtonsPanel.add(statusLabel); - inactiveButtonsPanel.add(Box.createHorizontalStrut(15)); + statusLabel = new JLabel(" "); + inactiveButtonsPanel.add(statusLabel); + inactiveButtonsPanel.add(Box.createHorizontalStrut(15)); - panel.add(inactiveButtonsPanel); - } + panel.add(inactiveButtonsPanel); panel.add(Box.createVerticalStrut(15)); } - private JTextPane makeNewDescription(JPanel panel) { - if (panel.getComponentCount() > 0) { - panel.remove(0); - } - JTextPane description = new JTextPane(); - description.setInheritsPopupMenu(true); - Insets margin = description.getMargin(); - margin.bottom = 0; - description.setMargin(margin); - description.setContentType("text/html"); - Document doc = description.getDocument(); - if (doc instanceof HTMLDocument) { - HTMLDocument html = (HTMLDocument) doc; - StyleSheet stylesheet = html.getStyleSheet(); - stylesheet.addRule("body { margin: 0; padding: 0;" - + "font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;" - + "font-size: 100%;" + "font-size: 0.95em; }"); - } - description.setOpaque(false); - description.setBorder(new EmptyBorder(4, 7, 7, 7)); - description.setHighlighter(null); - description.setEditable(false); - description.addHyperlinkListener(e -> { - if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - Base.openURL(e.getDescription()); - } - }); - description.addKeyListener(new DelegatingKeyListener(parentTable)); - panel.add(description, 0); - return description; - } - - protected void onRemove(ContributedPlatform contributedPlatform) { - // Empty - } - - protected void onInstall(ContributedPlatform contributedPlatform, ContributedPlatform installed) { - // Empty - } - - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, - boolean hasFocus, int row, - int column) { - parentTable = table; - setEnabled(false); - Component component = getUpdatedCellComponent(value, isSelected, row, false); - if (row % 2 == 0) { - component.setBackground(new Color(236, 241, 241)); //#ecf1f1 - } else { - component.setBackground(new Color(255, 255, 255)); - } - - int height = new Double(component.getPreferredSize().getHeight()).intValue(); - if (table.getRowHeight(row) < height) { - table.setRowHeight(row, height); - } - - return component; - } - - private ContributionIndexTableModel.ContributedPlatformReleases editorValue; - private JTable parentTable; - - @Override - public Object getCellEditorValue() { - return editorValue; - } - - @Override - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, int row, - int column) { - parentTable = table; - editorValue = (ContributionIndexTableModel.ContributedPlatformReleases) value; - setEnabled(true); - - final ContributedPlatform installed = editorValue.getInstalled(); - - java.util.List releases = new LinkedList<>(editorValue.releases); - java.util.List uninstalledReleases = releases.stream().filter(new InstalledPredicate().negate()).collect(Collectors.toList()); - - java.util.List installedBuiltIn = releases.stream().filter(new InstalledPredicate()).filter(new BuiltInPredicate()).collect(Collectors.toList()); - - if (installed != null && !installedBuiltIn.contains(installed)) { - uninstalledReleases.addAll(installedBuiltIn); - } - - Collections.sort(uninstalledReleases, new ReverseComparator<>(new DownloadableContributionVersionComparator())); - - downgradeChooser.removeAllItems(); - downgradeChooser.addItem(tr("Select version")); - - final java.util.List uninstalledPreviousReleases = new LinkedList<>(); - final java.util.List uninstalledNewerReleases = new LinkedList<>(); - - final VersionComparator versionComparator = new VersionComparator(); - uninstalledReleases.stream().forEach(input -> { - if (installed == null || versionComparator.greaterThan(installed.getParsedVersion(), input.getParsedVersion())) { - uninstalledPreviousReleases.add(input); - } else { - uninstalledNewerReleases.add(input); - } - }); - uninstalledNewerReleases.forEach(downgradeChooser::addItem); - uninstalledPreviousReleases.forEach(downgradeChooser::addItem); - - downgradeChooser.setVisible(installed != null && (!uninstalledPreviousReleases.isEmpty() || uninstalledNewerReleases.size() > 1)); - downgradeButton.setVisible(installed != null && (!uninstalledPreviousReleases.isEmpty() || uninstalledNewerReleases.size() > 1)); - - versionToInstallChooser.removeAllItems(); - uninstalledReleases.forEach(versionToInstallChooser::addItem); - versionToInstallChooser.setVisible(installed == null && uninstalledReleases.size() > 1); - - Component component = getUpdatedCellComponent(value, true, row, !installedBuiltIn.isEmpty()); - component.setBackground(new Color(218, 227, 227)); //#dae3e3 - return component; - } - - private Component getUpdatedCellComponent(Object value, boolean isSelected, int row, boolean hasBuiltInRelease) { + void update(JTable parentTable, Object value, boolean isSelected, int row, + boolean hasBuiltInRelease) { ContributionIndexTableModel.ContributedPlatformReleases releases = (ContributionIndexTableModel.ContributedPlatformReleases) value; JTextPane description = makeNewDescription(panel); - //FIXME: happens on macosx, don't know why + // FIXME: happens on macosx, don't know why if (releases == null) { - return panel; + return; } ContributedPlatform selected = releases.getSelected(); @@ -294,7 +168,8 @@ public class ContributedPlatformTableCell extends InstallerTableCell { } else { installable = false; removable = !installed.isReadOnly() && !hasBuiltInRelease; - upgradable = new DownloadableContributionVersionComparator().compare(selected, installed) > 0; + upgradable = new DownloadableContributionVersionComparator() + .compare(selected, installed) > 0; } if (installable) { installButton.setText(tr("Install")); @@ -318,7 +193,9 @@ public class ContributedPlatformTableCell extends InstallerTableCell { desc += " " + format("by {0}", author); } if (installed != null) { - desc += " " + format(tr("version {0}"), installed.getParsedVersion()) + " INSTALLED"; + desc += " " + + format(tr("version {0}"), installed.getParsedVersion()) + + " INSTALLED"; } desc += "
"; @@ -358,7 +235,8 @@ public class ContributedPlatformTableCell extends InstallerTableCell { // See: // http://stackoverflow.com/questions/3081210/how-to-set-jtextarea-to-have-height-that-matches-the-size-of-a-text-it-contains int width = parentTable.getBounds().width; - setJTextPaneDimensionToFitContainedText(description, width); + InstallerTableCell.setJTextPaneDimensionToFitContainedText(description, + width); if (isSelected) { panel.setBackground(parentTable.getSelectionBackground()); @@ -367,41 +245,37 @@ public class ContributedPlatformTableCell extends InstallerTableCell { panel.setBackground(parentTable.getBackground()); panel.setForeground(parentTable.getForeground()); } - - return panel; } - private final Timer enabler = new Timer(100, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - enable(true); - enabler.stop(); + private static JTextPane makeNewDescription(JPanel panel) { + if (panel.getComponentCount() > 0) { + panel.remove(0); } - }); - - @Override - public void setEnabled(boolean enabled) { - enable(false); - if (enabled) { - enabler.start(); - } else { - enabler.stop(); + JTextPane description = new JTextPane(); + description.setInheritsPopupMenu(true); + Insets margin = description.getMargin(); + margin.bottom = 0; + description.setMargin(margin); + description.setContentType("text/html"); + Document doc = description.getDocument(); + if (doc instanceof HTMLDocument) { + HTMLDocument html = (HTMLDocument) doc; + StyleSheet stylesheet = html.getStyleSheet(); + stylesheet.addRule("body { margin: 0; padding: 0;" + + "font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;" + + "font-size: 100%;" + "font-size: 0.95em; }"); } - buttonsPanel.setVisible(enabled); - inactiveButtonsPanel.setVisible(!enabled); - } - - public void enable(boolean enabled) { - installButton.setEnabled(enabled); - removeButton.setEnabled(enabled); - } - - public void setStatus(String status) { - statusLabel.setText(status); - } - - public void invalidate() { - panel.invalidate(); + description.setOpaque(false); + description.setBorder(new EmptyBorder(4, 7, 7, 7)); + description.setHighlighter(null); + description.setEditable(false); + description.addHyperlinkListener(e -> { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + Base.openURL(e.getDescription()); + } + }); + panel.add(description, 0); + return description; } } diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java new file mode 100644 index 000000000..4c245c7d8 --- /dev/null +++ b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java @@ -0,0 +1,184 @@ +/* + * 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.contributions.packages.ui; + +import static processing.app.I18n.tr; + +import java.awt.Color; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Collections; +import java.util.LinkedList; +import java.util.stream.Collectors; + +import javax.swing.JTable; +import javax.swing.Timer; + +import cc.arduino.contributions.DownloadableContributionVersionComparator; +import cc.arduino.contributions.VersionComparator; +import cc.arduino.contributions.filters.BuiltInPredicate; +import cc.arduino.contributions.filters.InstalledPredicate; +import cc.arduino.contributions.packages.ContributedPlatform; +import cc.arduino.contributions.ui.InstallerTableCell; +import cc.arduino.utils.ReverseComparator; + +@SuppressWarnings("serial") +public class ContributedPlatformTableCellEditor extends InstallerTableCell { + + private ContributedPlatformTableCell editorCell; + private ContributionIndexTableModel.ContributedPlatformReleases editorValue; + + @Override + public Object getCellEditorValue() { + return editorValue; + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, + int column) { + editorCell = new ContributedPlatformTableCell(); + editorCell.installButton + .addActionListener(e -> onInstall(editorValue.getSelected(), + editorValue.getInstalled())); + editorCell.removeButton + .addActionListener(e -> onRemove(editorValue.getInstalled())); + editorCell.downgradeButton.addActionListener(e -> { + ContributedPlatform selected = (ContributedPlatform) editorCell.downgradeChooser + .getSelectedItem(); + onInstall(selected, editorValue.getInstalled()); + }); + editorCell.versionToInstallChooser.addItemListener(e -> editorValue + .select((ContributedPlatform) editorCell.versionToInstallChooser + .getSelectedItem())); + + editorValue = (ContributionIndexTableModel.ContributedPlatformReleases) value; + setEnabled(true); + + final ContributedPlatform installed = editorValue.getInstalled(); + + java.util.List releases = new LinkedList<>( + editorValue.releases); + java.util.List uninstalledReleases = releases.stream() + .filter(new InstalledPredicate().negate()).collect(Collectors.toList()); + + java.util.List installedBuiltIn = releases.stream() + .filter(new InstalledPredicate()).filter(new BuiltInPredicate()) + .collect(Collectors.toList()); + + if (installed != null && !installedBuiltIn.contains(installed)) { + uninstalledReleases.addAll(installedBuiltIn); + } + + Collections.sort(uninstalledReleases, new ReverseComparator<>( + new DownloadableContributionVersionComparator())); + + editorCell.downgradeChooser.removeAllItems(); + editorCell.downgradeChooser.addItem(tr("Select version")); + + final java.util.List uninstalledPreviousReleases = new LinkedList<>(); + final java.util.List uninstalledNewerReleases = new LinkedList<>(); + + final VersionComparator versionComparator = new VersionComparator(); + uninstalledReleases.stream().forEach(input -> { + if (installed == null + || versionComparator.greaterThan(installed.getParsedVersion(), + input.getParsedVersion())) { + uninstalledPreviousReleases.add(input); + } else { + uninstalledNewerReleases.add(input); + } + }); + uninstalledNewerReleases.forEach(editorCell.downgradeChooser::addItem); + uninstalledPreviousReleases.forEach(editorCell.downgradeChooser::addItem); + + editorCell.downgradeChooser + .setVisible(installed != null + && (!uninstalledPreviousReleases.isEmpty() + || uninstalledNewerReleases.size() > 1)); + editorCell.downgradeButton + .setVisible(installed != null + && (!uninstalledPreviousReleases.isEmpty() + || uninstalledNewerReleases.size() > 1)); + + editorCell.versionToInstallChooser.removeAllItems(); + uninstalledReleases.forEach(editorCell.versionToInstallChooser::addItem); + editorCell.versionToInstallChooser + .setVisible(installed == null && uninstalledReleases.size() > 1); + + editorCell.update(table, value, true, row, !installedBuiltIn.isEmpty()); + editorCell.panel.setBackground(new Color(218, 227, 227)); // #dae3e3 + return editorCell.panel; + } + + private final 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(); + } else { + enabler.stop(); + } + editorCell.buttonsPanel.setVisible(enabled); + editorCell.inactiveButtonsPanel.setVisible(!enabled); + } + + public void enable(boolean enabled) { + editorCell.installButton.setEnabled(enabled); + editorCell.removeButton.setEnabled(enabled); + } + + public void setStatus(String status) { + editorCell.statusLabel.setText(status); + } + + public void invalidate() { + editorCell.panel.invalidate(); + } + + protected void onRemove(ContributedPlatform contributedPlatform) { + // Empty + } + + protected void onInstall(ContributedPlatform contributedPlatform, + ContributedPlatform installed) { + // Empty + } + +} diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellRenderer.java b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellRenderer.java new file mode 100644 index 000000000..85339adfe --- /dev/null +++ b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellRenderer.java @@ -0,0 +1,67 @@ +/* + * 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.contributions.packages.ui; + +import java.awt.Color; +import java.awt.Component; + +import javax.swing.JTable; +import javax.swing.table.TableCellRenderer; + +@SuppressWarnings("serial") +public class ContributedPlatformTableCellRenderer implements TableCellRenderer { + + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, + boolean hasFocus, int row, + int column) { + ContributedPlatformTableCell cell = new ContributedPlatformTableCell(); + cell.installButton.setEnabled(false); + cell.removeButton.setEnabled(false); + cell.buttonsPanel.setVisible(false); + cell.inactiveButtonsPanel.setVisible(true); + + cell.update(table, value, isSelected, row, false); + if (row % 2 == 0) { + cell.panel.setBackground(new Color(236, 241, 241)); // #ecf1f1 + } else { + cell.panel.setBackground(new Color(255, 255, 255)); + } + + int height = new Double(cell.panel.getPreferredSize().getHeight()) + .intValue(); + if (table.getRowHeight(row) < height) { + table.setRowHeight(row, height); + } + + return cell.panel; + } + +} diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java b/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java index 307c02cf6..7e1389637 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java @@ -38,6 +38,8 @@ import processing.app.BaseNoGui; import processing.app.I18n; import javax.swing.*; +import javax.swing.table.TableCellRenderer; + import java.awt.*; import java.util.Collection; import java.util.LinkedList; @@ -60,15 +62,16 @@ public class ContributionManagerUI extends InstallerJDialog { } @Override - protected InstallerTableCell createCellRenderer() { - return new ContributedPlatformTableCell(); + protected TableCellRenderer createCellRenderer() { + return new ContributedPlatformTableCellRenderer(); } @Override protected InstallerTableCell createCellEditor() { - return new ContributedPlatformTableCell() { + return new ContributedPlatformTableCellEditor() { @Override - protected void onInstall(ContributedPlatform selected, ContributedPlatform installed) { + protected void onInstall(ContributedPlatform selected, + ContributedPlatform installed) { if (selected.isReadOnly()) { onRemovePressed(installed, false); } else { @@ -84,12 +87,14 @@ public class ContributionManagerUI extends InstallerJDialog { } public ContributionManagerUI(Frame parent, ContributionInstaller installer) { - super(parent, tr("Boards Manager"), Dialog.ModalityType.APPLICATION_MODAL, tr("Unable to reach Arduino.cc due to possible network issues.")); + super(parent, tr("Boards Manager"), Dialog.ModalityType.APPLICATION_MODAL, + tr("Unable to reach Arduino.cc due to possible network issues.")); this.installer = installer; } public void updateUI() { - DropdownItem previouslySelectedCategory = (DropdownItem) categoryChooser.getSelectedItem(); + DropdownItem previouslySelectedCategory = (DropdownItem) categoryChooser + .getSelectedItem(); categoryChooser.removeActionListener(categoryChooserActionListener); @@ -138,7 +143,8 @@ public class ContributionManagerUI extends InstallerJDialog { installerThread = new Thread(() -> { try { setProgressVisible(true, ""); - List downloadedPackageIndexFiles = installer.updateIndex(this::setProgress); + List downloadedPackageIndexFiles = installer + .updateIndex(this::setProgress); installer.deleteUnknownFiles(downloadedPackageIndexFiles); onIndexesUpdated(); } catch (Exception e) { @@ -148,11 +154,14 @@ public class ContributionManagerUI extends InstallerJDialog { } }); installerThread.setName("ContributionManager Update Thread"); - installerThread.setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler(this, noConnectionErrorMessage)); + installerThread + .setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler( + this, noConnectionErrorMessage)); installerThread.start(); } - public void onInstallPressed(final ContributedPlatform platformToInstall, final ContributedPlatform platformToRemove) { + public void onInstallPressed(final ContributedPlatform platformToInstall, + final ContributedPlatform platformToRemove) { clearErrorMessage(); installerThread = new Thread(() -> { List errors = new LinkedList<>(); @@ -173,15 +182,24 @@ public class ContributionManagerUI extends InstallerJDialog { } }); installerThread.setName("ContributionManager Install Thread"); - installerThread.setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler(this, noConnectionErrorMessage)); + installerThread + .setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler( + this, noConnectionErrorMessage)); installerThread.start(); } - public void onRemovePressed(final ContributedPlatform platform, boolean showWarning) { + public void onRemovePressed(final ContributedPlatform platform, + boolean showWarning) { clearErrorMessage(); if (showWarning) { - int chosenOption = JOptionPane.showConfirmDialog(this, I18n.format(tr("Do you want to remove {0}?\nIf you do so you won't be able to use {0} any more."), platform.getName()), tr("Please confirm boards deletion"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + int chosenOption = JOptionPane + .showConfirmDialog(this, + I18n.format(tr("Do you want to remove {0}?\nIf you do so you won't be able to use {0} any more."), + platform.getName()), + tr("Please confirm boards deletion"), + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); if (chosenOption != JOptionPane.YES_OPTION) { return; } @@ -199,7 +217,9 @@ public class ContributionManagerUI extends InstallerJDialog { } }); installerThread.setName("ContributionManager Remove Thread"); - installerThread.setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler(this, noConnectionErrorMessage)); + installerThread + .setUncaughtExceptionHandler(new InstallerJDialogUncaughtExceptionHandler( + this, noConnectionErrorMessage)); installerThread.start(); }