From 60f267745b033a1004d9ee04442852340e81c2cc Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 2 Oct 2017 16:29:07 +0200 Subject: [PATCH] Add on-hover selection on Board/Library manager User testing on skilled devs showed that "buttons appear on click" behaviour is far from being understood. Accessibility features (like moving with Arrow keys) should be untouched. --- .../ui/ContributedLibraryTableCellEditor.java | 9 ++++--- .../ui/ContributedLibraryTableCellJPanel.java | 7 ++++-- .../libraries/ui/LibraryManagerUI.java | 1 + .../ContributedPlatformTableCellEditor.java | 9 ++++--- .../ContributedPlatformTableCellJPanel.java | 3 +++ .../contributions/ui/InstallerJDialog.java | 25 +++++++++++++++++++ .../contributions/ui/InstallerTableCell.java | 10 ++++++++ 7 files changed, 56 insertions(+), 8 deletions(-) diff --git a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellEditor.java b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellEditor.java index f2299ac52..3486aded2 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellEditor.java +++ b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellEditor.java @@ -76,9 +76,12 @@ public class ContributedLibraryTableCellEditor extends InstallerTableCell { ContributedLibrary lib = (ContributedLibrary) chooser.getSelectedItem(); onInstall(lib, editorValue.getInstalled()); }); - editorCell.versionToInstallChooser.addItemListener(e -> editorValue - .select((ContributedLibrary) editorCell.versionToInstallChooser - .getSelectedItem())); + editorCell.versionToInstallChooser.addActionListener(e -> { + editorValue.select((ContributedLibrary) editorCell.versionToInstallChooser.getSelectedItem()); + if (editorCell.versionToInstallChooser.getSelectedIndex() != 0) { + InstallerTableCell.dropdownSelected(true); + } + }); setEnabled(true); diff --git a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java index ac5dbe66b..5df53d4e8 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java +++ b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java @@ -54,10 +54,13 @@ public class ContributedLibraryTableCellJPanel extends JPanel { downgradeChooser.addItem("-"); downgradeChooser.setMaximumSize(new Dimension((int)downgradeChooser.getPreferredSize().getWidth() + 50, (int)downgradeChooser.getPreferredSize().getHeight())); downgradeChooser.setMinimumSize(new Dimension((int)downgradeChooser.getPreferredSize().getWidth() + 50, (int)downgradeChooser.getPreferredSize().getHeight())); - downgradeChooser.addItemListener(e -> { + downgradeChooser.addActionListener(e -> { Object selectVersionItem = downgradeChooser.getItemAt(0); - boolean disableDowngrade = (e.getItem() == selectVersionItem); + boolean disableDowngrade = (downgradeChooser.getSelectedItem() == selectVersionItem); downgradeButton.setEnabled(!disableDowngrade); + if (!disableDowngrade) { + InstallerTableCell.dropdownSelected(true); + } }); versionToInstallChooser = new JComboBox(); diff --git a/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java b/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java index 4c9470019..43696b117 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java +++ b/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java @@ -117,6 +117,7 @@ public class LibraryManagerUI extends InstallerJDialog { @Override public void actionPerformed(ActionEvent event) { DropdownItem selected = (DropdownItem) typeChooser.getSelectedItem(); + previousRowAtPoint = -1; if (typeFilter == null || !typeFilter.equals(selected)) { typeFilter = selected.getFilterPredicate(); if (contribTable.getCellEditor() != null) { diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java index cc3cfbb63..43cbec6fa 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java @@ -74,9 +74,12 @@ public class ContributedPlatformTableCellEditor extends InstallerTableCell { .getSelectedItem(); onInstall(selected, value.getInstalled()); }); - cell.versionToInstallChooser.addItemListener(e -> value - .select((ContributedPlatform) cell.versionToInstallChooser - .getSelectedItem())); + cell.versionToInstallChooser.addActionListener(e -> { + value.select((ContributedPlatform) cell.versionToInstallChooser.getSelectedItem()); + if (cell.versionToInstallChooser.getSelectedIndex() != 0) { + InstallerTableCell.dropdownSelected(true); + } + }); setEnabled(true); diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java index 75464f3d0..e4c035746 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java @@ -98,6 +98,9 @@ public class ContributedPlatformTableCellJPanel extends JPanel { Object selectVersionItem = downgradeChooser.getItemAt(0); boolean disableDowngrade = (e.getItem() == selectVersionItem); downgradeButton.setEnabled(!disableDowngrade); + if (!disableDowngrade) { + InstallerTableCell.dropdownSelected(true); + } }); versionToInstallChooser = new JComboBox(); diff --git a/app/src/cc/arduino/contributions/ui/InstallerJDialog.java b/app/src/cc/arduino/contributions/ui/InstallerJDialog.java index 4563b21fd..5445f48a1 100644 --- a/app/src/cc/arduino/contributions/ui/InstallerJDialog.java +++ b/app/src/cc/arduino/contributions/ui/InstallerJDialog.java @@ -43,6 +43,8 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; import java.util.function.Predicate; import java.util.stream.Stream; @@ -88,6 +90,8 @@ public abstract class InstallerJDialog extends JDialog { private final JButton closeButton; private final JButton dismissErrorMessageButton; + protected int previousRowAtPoint = -1; + abstract protected FilteredAbstractTableModel createContribModel(); abstract protected TableCellRenderer createCellRenderer(); @@ -118,6 +122,7 @@ public abstract class InstallerJDialog extends JDialog { filterField = new FilterJTextField(tr("Filter your search...")) { @Override protected void onFilter(String[] _filters) { + previousRowAtPoint = -1; filters = _filters; if (contribTable.getCellEditor() != null) { contribTable.getCellEditor().stopCellEditing(); @@ -167,6 +172,25 @@ public abstract class InstallerJDialog extends JDialog { } }); + contribTable.addMouseMotionListener(new MouseMotionListener() { + + public void mouseDragged(MouseEvent e) {} + + public void mouseMoved(MouseEvent e) { + // avoid firing edits events until the mouse changes cell or the user is back on the cell after selecting a dropdown + int rowAtPoint = contribTable.rowAtPoint(e.getPoint()); + if (!InstallerTableCell.isDropdownSelected() && rowAtPoint != previousRowAtPoint) { + contribTable.editCellAt(rowAtPoint, 0); + previousRowAtPoint = rowAtPoint; + InstallerTableCell.dropdownSelected(false); + } + if (InstallerTableCell.isDropdownSelected() && rowAtPoint == previousRowAtPoint) { + // back to the original cell, can drop dropdown selector lock + InstallerTableCell.dropdownSelected(false); + } + } + }); + { TableColumnModel tcm = contribTable.getColumnModel(); TableColumn col = tcm.getColumn(0); @@ -286,6 +310,7 @@ public abstract class InstallerJDialog extends JDialog { @Override public void actionPerformed(ActionEvent event) { DropdownItem selected = (DropdownItem) categoryChooser.getSelectedItem(); + previousRowAtPoint = -1; if (categoryFilter == null || !categoryFilter.equals(selected)) { categoryFilter = selected.getFilterPredicate(); if (contribTable.getCellEditor() != null) { diff --git a/app/src/cc/arduino/contributions/ui/InstallerTableCell.java b/app/src/cc/arduino/contributions/ui/InstallerTableCell.java index bbf62ebad..3f94d3e0d 100644 --- a/app/src/cc/arduino/contributions/ui/InstallerTableCell.java +++ b/app/src/cc/arduino/contributions/ui/InstallerTableCell.java @@ -41,6 +41,16 @@ public abstract class InstallerTableCell extends AbstractCellEditor implements T abstract public void setEnabled(boolean b); + private static boolean dropdownSelected = false; + + public static boolean isDropdownSelected( ) { + return dropdownSelected; + } + + public static void dropdownSelected(boolean b) { + dropdownSelected = b; + } + abstract public void setStatus(String s); public static void setJTextPaneDimensionToFitContainedText(JTextPane jTextPane, int width) {