From 6814a150284366abd473f06098c930af662bf6ba Mon Sep 17 00:00:00 2001 From: Sylvain Vedrenne Date: Wed, 21 Dec 2011 02:25:25 +0100 Subject: [PATCH] Make it easier to play using the keyboard. --- .../sudokuki/ui/swing/DualSelectionDialog.java | 7 +- .../sudokuki/ui/swing/SelectMemosPanel.java | 129 ++++++++++++++------- .../sudokuki/ui/swing/SelectNumberPanel.java | 95 ++++++++++----- .../net/jankenpoi/sudokuki/ui/swing/SwingGrid.java | 14 +-- 4 files changed, 164 insertions(+), 81 deletions(-) diff --git a/src/classes/net/jankenpoi/sudokuki/ui/swing/DualSelectionDialog.java b/src/classes/net/jankenpoi/sudokuki/ui/swing/DualSelectionDialog.java index 5ac71c0..eb65cf4 100644 --- a/src/classes/net/jankenpoi/sudokuki/ui/swing/DualSelectionDialog.java +++ b/src/classes/net/jankenpoi/sudokuki/ui/swing/DualSelectionDialog.java @@ -30,7 +30,7 @@ public class DualSelectionDialog extends JDialog { public DualSelectionDialog(boolean valuePickerOnTop, JFrame parent, byte previousValue, Byte[] previousMemos) { super(parent, true); - JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane = new JTabbedPane(); numberPanel = new SelectNumberPanel(this, previousValue); memosPanel = new SelectMemosPanel(this, previousMemos); tabbedPane.addTab("Select", numberPanel); @@ -43,6 +43,11 @@ public class DualSelectionDialog extends JDialog { setResizable(false); } + private JTabbedPane tabbedPane; + JTabbedPane getTabbedPane() { + return tabbedPane; + } + private int value = -1; private byte[] memos = null; diff --git a/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectMemosPanel.java b/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectMemosPanel.java index db10738..65c5276 100644 --- a/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectMemosPanel.java +++ b/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectMemosPanel.java @@ -19,9 +19,7 @@ package net.jankenpoi.sudokuki.ui.swing; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Container; import java.awt.Font; -import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; @@ -32,17 +30,8 @@ import java.util.Iterator; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JDialog; import javax.swing.JPanel; -import javax.swing.JTabbedPane; import javax.swing.JToggleButton; -import javax.swing.WindowConstants; - -/* - * InputDialog.java - * - * Created on Mar 25, 2011, 5:50:15 PM - */ /** * @@ -53,9 +42,7 @@ public class SelectMemosPanel extends JPanel { private JButton btnClear; private JCheckBox[] ckb = new JCheckBox[9]; - private int focusedElement; - private boolean focusedOkButton; - private boolean focusedClearButton; + private int focusedElement = 4; private JButton btnConfirm; private JPanel panelClear = new JPanel(new GridLayout()); private JPanel panel789 = new JPanel(new GridLayout()); @@ -76,6 +63,8 @@ public class SelectMemosPanel extends JPanel { super(true); this.parent = parent; initComponents(previousMemos); + parent.getTabbedPane().addKeyListener(innerKeyListener); + parent.getTabbedPane().addFocusListener(innerFocusListener); } private void configureCheckBox(JCheckBox btn, String text, final int button) { @@ -180,6 +169,14 @@ public class SelectMemosPanel extends JPanel { focusedElement = 4; } + private boolean isTabSelected() { + int idx = parent.getTabbedPane().getSelectedIndex(); + if (idx != 1) { + System.out.println("SelectMemosPanel.isTabSelected() TAB NOT SELECTED"); + } + return (idx == 1); + } + private void buttonClicked(int button) { System.out.println("InputDialog.buttonClicked() button:" + button); byte value = (byte)(button + 1); @@ -207,13 +204,35 @@ public class SelectMemosPanel extends JPanel { private class InnerKeyListener extends KeyAdapter { @Override public void keyPressed(KeyEvent ke) { + if (isTabSelected() && focusedTabPane()) { + int code = ke.getKeyCode(); + if (code == KeyEvent.VK_H) { + System.out.println("MemosPanel tab selected <>HL"); + int index = parent.getTabbedPane().getSelectedIndex(); + int newIndex = (index == 0)?1:0; + System.out.println("MemosPanel tab selected index:"+index); + System.out.println("MemosPanel tab selected newIndex:"+newIndex); + parent.getTabbedPane().setSelectedIndex(newIndex); + parent.getTabbedPane().requestFocusInWindow(); + return; + } + else if (code == KeyEvent.VK_L) { + return; + } + } + if (!isTabSelected()) { + return; + } int code = ke.getKeyCode(); - if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP) { - if (focusedClearButton) { + if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP || code == KeyEvent.VK_K) { + if (focusedTabPane()) { + return; + } + if (focusedClearButton()) { + parent.getTabbedPane().requestFocusInWindow(); return; } - if (focusedOkButton) { - focusedOkButton = false; + if (focusedOkButton()) { ckb[focusedElement].requestFocusInWindow(); return; } @@ -224,12 +243,17 @@ public class SelectMemosPanel extends JPanel { focusedElement = Math.max(0, focusedElement-3); ckb[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN) { - if (focusedOkButton) { + else if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN || code == KeyEvent.VK_J) { + if (focusedTabPane()) { + btnClear.requestFocusInWindow(); return; } - if (focusedClearButton) { - focusedClearButton = false; + if (focusedOkButton()) { + return; + } + if (focusedClearButton()) { + focusedElement = 1; + System.out.println("focusedElement: "+focusedElement); ckb[focusedElement].requestFocusInWindow(); return; } @@ -240,15 +264,17 @@ public class SelectMemosPanel extends JPanel { focusedElement = Math.min(8, focusedElement+3); ckb[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT) { - if (focusedElement%3 == 0 || focusedOkButton || focusedClearButton) { + else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT || code == KeyEvent.VK_H) { + if (focusedElement%3 == 0 || btnConfirm.hasFocus() || btnClear.hasFocus()) { + System.out + .println("SelectMemosPanel.InnerKeyListener.keyPressed() OK or CLEAR has focus"); return; } focusedElement = Math.max(0, focusedElement-1); ckb[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT) { - if (focusedElement%3 == 2 || focusedOkButton || focusedClearButton) { + else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_L) { + if (focusedElement%3 == 2 || focusedOkButton() || focusedClearButton()) { return; } focusedElement = Math.min(8, focusedElement+1); @@ -259,12 +285,24 @@ public class SelectMemosPanel extends JPanel { } } + private boolean focusedTabPane() { + return parent.getTabbedPane().hasFocus(); + } + @Override public void keyReleased(KeyEvent ke) { - int code = ke.getKeyCode(); - if (code == KeyEvent.VK_SPACE) { + if (!isTabSelected()) { + return; } - else if (code == KeyEvent.VK_ENTER) { + int code = ke.getKeyCode(); + if (code == KeyEvent.VK_ENTER) { + if (focusedClearButton() || focusedOkButton()) { + /* + * Buttons actions are managing this so Nothing to do. + */ + return; + } + parent.memosPanelConfirmed(); } } @@ -274,8 +312,6 @@ public class SelectMemosPanel extends JPanel { @Override public void focusGained(FocusEvent e) { - focusedClearButton = false; - focusedOkButton = false; Component comp = e.getComponent(); if (comp == ckb[focusedElement]) { @@ -287,17 +323,28 @@ public class SelectMemosPanel extends JPanel { return; } } - if (comp == btnClear) { - focusedClearButton = true; - focusedElement = focusedElement%3; - return; - } - if (comp == btnConfirm) { - focusedOkButton = true; - focusedElement = 6 + focusedElement%3; - return; - } +// if (comp == btnClear) { +// focusedElement = focusedElement%3; +// return; +// } +// if (comp == btnConfirm) { +// focusedElement = 6 + focusedElement%3; +// return; +// } +// if (comp == parent.getTabbedPane()) { +// System.out +// .println("SelectMemosPanel.InnerFocusListener.focusGained() gettabbedpane.hasFocus():"+parent.getTabbedPane().hasFocus()); +// focusedElement = 1; +// return; +// } } } + private boolean focusedOkButton() { + return btnConfirm.hasFocus(); + } + + private boolean focusedClearButton() { + return btnClear.hasFocus(); + } } diff --git a/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectNumberPanel.java b/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectNumberPanel.java index ce3ca49..bfced72 100644 --- a/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectNumberPanel.java +++ b/src/classes/net/jankenpoi/sudokuki/ui/swing/SelectNumberPanel.java @@ -19,9 +19,7 @@ package net.jankenpoi.sudokuki.ui.swing; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Container; import java.awt.Font; -import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; @@ -29,15 +27,8 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JButton; -import javax.swing.JDialog; import javax.swing.JPanel; -/* - * InputDialog.java - * - * Created on Mar 25, 2011, 5:50:15 PM - */ - /** * * @author svedrenne @@ -63,7 +54,7 @@ public class SelectNumberPanel extends JPanel { private JPanel panel456 = new JPanel(new GridLayout()); private JPanel panel123 = new JPanel(new GridLayout()); private byte previousValue = 0; - + private InnerKeyListener innerKeyListener = new InnerKeyListener(); private int focusedElement = 4; private InnerFocusListener innerFocusListener = new InnerFocusListener(); @@ -75,6 +66,8 @@ public class SelectNumberPanel extends JPanel { this.previousValue = previousValue; initComponents(); btns[focusedElement].requestFocusInWindow(); + parent.getTabbedPane().addKeyListener(innerKeyListener); + parent.getTabbedPane().addFocusListener(innerFocusListener); } private void configureButton(JButton btn, String text, final int value) { @@ -125,7 +118,15 @@ public class SelectNumberPanel extends JPanel { panel123.add(btn3, BorderLayout.LINE_END); } - private void buttonClicked(int button) { + private boolean isTabSelected() { + int idx = parent.getTabbedPane().getSelectedIndex(); + if (idx != 0) { + System.out.println("SelectNumberPanel.isTabSelected() TAB NOT SELECTED"); + } + return (idx == 0); + } + + private void buttonClicked(int button) { System.out.println("InputDialog.buttonClicked() button:"+button); digit = button; parent.numberPanelConfirmed(); @@ -138,29 +139,62 @@ public class SelectNumberPanel extends JPanel { private class InnerKeyListener extends KeyAdapter { @Override public void keyPressed(KeyEvent ke) { - System.out.println("SelectMemosDialog.InnerKeyAdapter.keyPressed() ke:"+ke); + System.out + .println("SelectNumberPanel keyPressed() ke:"+ke); + if (focusedTabPane() && isTabSelected()) { + int code = ke.getKeyCode(); + if (code == KeyEvent.VK_L) { + System.out.println("NumberPanel tab selected <>HL"); + int index = parent.getTabbedPane().getSelectedIndex(); + int newIndex = (index == 0)?1:0; + System.out.println("NumberPanel tab selected index:"+index); + System.out.println("NumberPanel tab selected newIndex:"+newIndex); + parent.getTabbedPane().setSelectedIndex(newIndex); + parent.getTabbedPane().requestFocusInWindow(); + return; + } + else if (code == KeyEvent.VK_H) { + return; + } + } + if (!isTabSelected()) { + return; + } int code = ke.getKeyCode(); - if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN) { - if (focusedElement/3 == 0) + if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN || code == KeyEvent.VK_J) { + if (focusedTabPane()) { + focusedElement = 7; + btns[focusedElement].requestFocusInWindow(); return; + } + if (focusedElement/3 == 0) { + return; + } focusedElement = Math.max(0, focusedElement-3); btns[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP) { - if (focusedElement/3 == 2) + else if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP || code == KeyEvent.VK_K) { + if (focusedTabPane()) { + return; + } + if (focusedElement/3 == 2) { + parent.getTabbedPane().requestFocusInWindow(); return; + } focusedElement = Math.min(8, focusedElement+3); btns[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT) { - if (focusedElement%3 == 0) + else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT || code == KeyEvent.VK_H) { + if (focusedElement%3 == 0) { return; + } focusedElement = Math.max(0, focusedElement-1); btns[focusedElement].requestFocusInWindow(); } - else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT) { - if (focusedElement%3 == 2) + else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_L) { + if (focusedElement%3 == 2) { return; + } focusedElement = Math.min(8, focusedElement+1); btns[focusedElement].requestFocusInWindow(); } @@ -169,26 +203,19 @@ public class SelectNumberPanel extends JPanel { } } - @Override - public void keyReleased(KeyEvent ke) { - System.out.println("SelectMemosDialog.InnerKeyAdapter.keyReleased() ke:"+ke); - int code = ke.getKeyCode(); - if (code == KeyEvent.VK_SPACE) { - } - else if (code == KeyEvent.VK_ENTER) { - } + private boolean focusedTabPane() { + boolean res = parent.getTabbedPane().hasFocus(); + System.out.println("SelectNumberPanel tabbedPane focused?"+res); + return res; } - @Override - public void keyTyped(KeyEvent ke) { - System.out.println("SelectMemosDialog.InnerKeyAdapter.keyTyped() ke:"+ke); - } } private class InnerFocusListener extends FocusAdapter { @Override public void focusGained(FocusEvent e) { + Component comp = e.getComponent(); if (comp == btns[focusedElement]) { return; @@ -199,6 +226,10 @@ public class SelectNumberPanel extends JPanel { return; } } +// if (comp == parent.getTabbedPane()) { +// focusedElement = 7; +// return; +// } } } diff --git a/src/classes/net/jankenpoi/sudokuki/ui/swing/SwingGrid.java b/src/classes/net/jankenpoi/sudokuki/ui/swing/SwingGrid.java index 96ebfdd..ce8c597 100644 --- a/src/classes/net/jankenpoi/sudokuki/ui/swing/SwingGrid.java +++ b/src/classes/net/jankenpoi/sudokuki/ui/swing/SwingGrid.java @@ -81,7 +81,7 @@ public class SwingGrid extends JPanel implements Printable { this.parent = parent; this.view = view; - addMouseListener(this.innerMouseListener); + addMouseListener(innerMouseListener); addKeyListener(innerKeyListener); setPreferredSize(new Dimension(columns[columns.length - 1].getEnd() - columns[0].getStart() + offX * 2, @@ -546,28 +546,28 @@ public class SwingGrid extends JPanel implements Printable { System.out.println("SwingGrid.InnerKeyAdapter.keyPressed() ke:"+ke); int code = ke.getKeyCode(); boolean hasMoved = false; - if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN) { + if (code == KeyEvent.VK_KP_DOWN || code == KeyEvent.VK_DOWN || code == KeyEvent.VK_J) { if (posY < 8) { posY++; hasMoved = true; repaint(); } } - else if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP) { + else if (code == KeyEvent.VK_KP_UP || code == KeyEvent.VK_UP || code == KeyEvent.VK_K) { if (posY > 0) { posY--; hasMoved = true; repaint(); } } - else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT) { + else if (code == KeyEvent.VK_KP_LEFT || code == KeyEvent.VK_LEFT || code == KeyEvent.VK_H) { if (posX > 0) { posX--; hasMoved = true; repaint(); } } - else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT) { + else if (code == KeyEvent.VK_KP_RIGHT || code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_L) { if (posX < 8) { posX++; hasMoved = true; @@ -585,11 +585,11 @@ public class SwingGrid extends JPanel implements Printable { public void keyReleased(KeyEvent ke) { System.out.println("SwingGrid.InnerKeyAdapter.keyReleased() ke:"+ke); int code = ke.getKeyCode(); - if (code == KeyEvent.VK_SPACE) { + if (code == KeyEvent.VK_SPACE || code == KeyEvent.VK_SHIFT) { Point pos = getTopLeftPoint(posY, posX); selectValue(posY, posX, pos.x, pos.y); } - else if (code == KeyEvent.VK_SHIFT) { + else if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_ALT) { Point pos = getTopLeftPoint(posY, posX); selectMemos(posY, posX, pos.x, pos.y); } -- 2.11.0