diff --git a/src/main/java/se/lantz/gui/JoystickBottomPanel.java b/src/main/java/se/lantz/gui/JoystickBottomPanel.java index f6855a6..ec72177 100644 --- a/src/main/java/se/lantz/gui/JoystickBottomPanel.java +++ b/src/main/java/se/lantz/gui/JoystickBottomPanel.java @@ -74,7 +74,7 @@ public class JoystickBottomPanel extends JPanel { if (aComboBox == null) { - aComboBox = new KeySelectionComboBox(); + aComboBox = new KeySelectionComboBox(this.model); aComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -90,7 +90,7 @@ public class JoystickBottomPanel extends JPanel { if (bComboBox == null) { - bComboBox = new KeySelectionComboBox(); + bComboBox = new KeySelectionComboBox(this.model); bComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -106,7 +106,7 @@ public class JoystickBottomPanel extends JPanel { if (cComboBox == null) { - cComboBox = new KeySelectionComboBox(); + cComboBox = new KeySelectionComboBox(this.model); cComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) diff --git a/src/main/java/se/lantz/gui/JoystickPanel.java b/src/main/java/se/lantz/gui/JoystickPanel.java index 3c3a094..46e2a24 100644 --- a/src/main/java/se/lantz/gui/JoystickPanel.java +++ b/src/main/java/se/lantz/gui/JoystickPanel.java @@ -36,6 +36,7 @@ public class JoystickPanel extends JPanel private JTextField configTextField; private JoystickModel model; + private JPanel configPanel; public JoystickPanel(int portnumber, JoystickModel model) { @@ -102,18 +103,13 @@ public class JoystickPanel extends JPanel gbc_joystickBottomPanel.gridx = 0; gbc_joystickBottomPanel.gridy = 5; add(getJoystickBottomPanel(), gbc_joystickBottomPanel); - GridBagConstraints gbc_configLabel = new GridBagConstraints(); - gbc_configLabel.anchor = GridBagConstraints.EAST; - gbc_configLabel.insets = new Insets(0, 0, 0, 5); - gbc_configLabel.gridx = 0; - gbc_configLabel.gridy = 6; - add(getConfigLabel(), gbc_configLabel); - GridBagConstraints gbc_configTextField = new GridBagConstraints(); - gbc_configTextField.insets = new Insets(0, 0, 0, 5); - gbc_configTextField.fill = GridBagConstraints.HORIZONTAL; - gbc_configTextField.gridx = 1; - gbc_configTextField.gridy = 6; - add(getConfigTextField(), gbc_configTextField); + GridBagConstraints gbc_configPanel = new GridBagConstraints(); + gbc_configPanel.fill = GridBagConstraints.HORIZONTAL; + gbc_configPanel.insets = new Insets(0, 0, 0, 5); + gbc_configPanel.gridx = 0; + gbc_configPanel.gridwidth = 3; + gbc_configPanel.gridy = 6; + add(getConfigPanel(), gbc_configPanel); if (!Beans.isDesignTime()) { model.addPropertyChangeListener((e) -> modelChanged()); @@ -161,7 +157,7 @@ public class JoystickPanel extends JPanel { if (leftFireComboBox == null) { - leftFireComboBox = new KeySelectionComboBox(); + leftFireComboBox = new KeySelectionComboBox(this.model); leftFireComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -189,7 +185,7 @@ public class JoystickPanel extends JPanel { if (rightFireComboBox == null) { - rightFireComboBox = new KeySelectionComboBox(); + rightFireComboBox = new KeySelectionComboBox(this.model); rightFireComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -205,7 +201,7 @@ public class JoystickPanel extends JPanel { if (tlComboBox == null) { - tlComboBox = new KeySelectionComboBox(); + tlComboBox = new KeySelectionComboBox(this.model); tlComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -221,7 +217,7 @@ public class JoystickPanel extends JPanel { if (trComboBox == null) { - trComboBox = new KeySelectionComboBox(); + trComboBox = new KeySelectionComboBox(this.model); trComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -283,4 +279,26 @@ public class JoystickPanel extends JPanel } return configTextField; } + private JPanel getConfigPanel() { + if (configPanel == null) { + configPanel = new JPanel(); + GridBagLayout gbl_configPanel = new GridBagLayout(); + configPanel.setLayout(gbl_configPanel); + GridBagConstraints gbc_configLabel = new GridBagConstraints(); + gbc_configLabel.anchor = GridBagConstraints.WEST; + gbc_configLabel.insets = new Insets(0, 10, 0, 5); + gbc_configLabel.gridx = 0; + gbc_configLabel.gridy = 0; + configPanel.add(getConfigLabel(), gbc_configLabel); + GridBagConstraints gbc_configTextField = new GridBagConstraints(); + gbc_configTextField.insets = new Insets(0, 0, 0, 20); + gbc_configTextField.fill = GridBagConstraints.HORIZONTAL; + gbc_configTextField.weightx = 1.0; + gbc_configTextField.anchor = GridBagConstraints.NORTHWEST; + gbc_configTextField.gridx = 1; + gbc_configTextField.gridy = 0; + configPanel.add(getConfigTextField(), gbc_configTextField); + } + return configPanel; + } } diff --git a/src/main/java/se/lantz/gui/JoystickStickPanel.java b/src/main/java/se/lantz/gui/JoystickStickPanel.java index 011ec83..ea1a84e 100644 --- a/src/main/java/se/lantz/gui/JoystickStickPanel.java +++ b/src/main/java/se/lantz/gui/JoystickStickPanel.java @@ -69,7 +69,7 @@ public class JoystickStickPanel extends JPanel { if (upComboBox == null) { - upComboBox = new KeySelectionComboBox(); + upComboBox = new KeySelectionComboBox(this.model); upComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -85,7 +85,7 @@ public class JoystickStickPanel extends JPanel { if (leftComboBox == null) { - leftComboBox = new KeySelectionComboBox(); + leftComboBox = new KeySelectionComboBox(this.model); leftComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -101,7 +101,7 @@ public class JoystickStickPanel extends JPanel { if (rightComboBox == null) { - rightComboBox = new KeySelectionComboBox(); + rightComboBox = new KeySelectionComboBox(this.model); rightComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) @@ -117,7 +117,7 @@ public class JoystickStickPanel extends JPanel { if (downComboBox == null) { - downComboBox = new KeySelectionComboBox(); + downComboBox = new KeySelectionComboBox(this.model); downComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) diff --git a/src/main/java/se/lantz/gui/KeySelectionComboBox.java b/src/main/java/se/lantz/gui/KeySelectionComboBox.java index 1430d6a..0bcc07f 100644 --- a/src/main/java/se/lantz/gui/KeySelectionComboBox.java +++ b/src/main/java/se/lantz/gui/KeySelectionComboBox.java @@ -7,6 +7,8 @@ import java.util.Objects; import javax.swing.JComboBox; +import se.lantz.model.JoystickModel; + public class KeySelectionComboBox extends JComboBox { @@ -17,9 +19,12 @@ public class KeySelectionComboBox extends JComboBox Map codeMap = new HashMap<>(); - public KeySelectionComboBox() + private JoystickModel model; + + public KeySelectionComboBox(JoystickModel model) { super(); + this.model = model; setupItemsAndCodes(); } @@ -31,50 +36,10 @@ public class KeySelectionComboBox extends JComboBox this.addItem("Left"); this.addItem("Right"); this.addItem("Fire"); - this.addItem("F1"); - this.addItem("F2"); - this.addItem("F3"); - this.addItem("F4"); - this.addItem("F5"); - this.addItem("F6"); - this.addItem("F7"); - this.addItem("F8"); - this.addItem("A"); - this.addItem("B"); - this.addItem("C"); - this.addItem("D"); - this.addItem("E"); - this.addItem("F"); - this.addItem("G"); - this.addItem("H"); - this.addItem("I"); - this.addItem("J"); - this.addItem("K"); - this.addItem("L"); - this.addItem("M"); - this.addItem("N"); - this.addItem("O"); - this.addItem("P"); - this.addItem("Q"); - this.addItem("R"); - this.addItem("S"); - this.addItem("T"); - this.addItem("U"); - this.addItem("V"); - this.addItem("W"); - this.addItem("X"); - this.addItem("Y"); - this.addItem("Z"); - this.addItem("1"); - this.addItem("2"); - this.addItem("3"); - this.addItem("4"); - this.addItem("5"); - this.addItem("6"); - this.addItem("7"); - this.addItem("8"); - this.addItem("9"); - this.addItem("0"); + for (String code : model.getKeyCodeList()) + { + this.addItem(code); + } this.addItem("ARROW LEFT"); this.addItem("ARROW UP"); this.addItem("THEC64"); @@ -94,32 +59,99 @@ public class KeySelectionComboBox extends JComboBox this.addItem("SHIFT LOCK"); this.addItem("SPACE"); this.addItem("£ (Pound)"); - // Codes not matching the text - codeMap.put("", "----"); - codeMap.put("JU", "Up"); - codeMap.put("JD", "Down"); - codeMap.put("JL", "Left"); - codeMap.put("JR", "Right"); - codeMap.put("JF", "Fire"); - codeMap.put("AL", "ARROW LEFT"); - codeMap.put("AU", "ARROW UP"); - codeMap.put("CM", "THEC64"); - codeMap.put("CO", ", (Comma)"); - codeMap.put("CT", "CTRL"); - codeMap.put("CU", "Cursor Up"); - codeMap.put("CD", "Cursor Down"); - codeMap.put("CL", "Cursor Left"); - codeMap.put("CR", "Cursor Right"); - codeMap.put("DL", "INST/DEL"); - codeMap.put("EN", "RETURN"); - codeMap.put("HM", "CLR/HOME"); - codeMap.put("RS", "RUN/STOP"); - codeMap.put("RE", "RESTORE"); - codeMap.put("SL", "Left SHIFT"); - codeMap.put("SR", "Right SHIFT"); - codeMap.put("SS", "SHIFT LOCK"); - codeMap.put("SP", "SPACE"); - codeMap.put("PO", "£ (Pound)"); + + codeMap = model.getKeyCodeMap(); + +// +// this.addItem("F1"); +// this.addItem("F2"); +// this.addItem("F3"); +// this.addItem("F4"); +// this.addItem("F5"); +// this.addItem("F6"); +// this.addItem("F7"); +// this.addItem("F8"); +// this.addItem("A"); +// this.addItem("B"); +// this.addItem("C"); +// this.addItem("D"); +// this.addItem("E"); +// this.addItem("F"); +// this.addItem("G"); +// this.addItem("H"); +// this.addItem("I"); +// this.addItem("J"); +// this.addItem("K"); +// this.addItem("L"); +// this.addItem("M"); +// this.addItem("N"); +// this.addItem("O"); +// this.addItem("P"); +// this.addItem("Q"); +// this.addItem("R"); +// this.addItem("S"); +// this.addItem("T"); +// this.addItem("U"); +// this.addItem("V"); +// this.addItem("W"); +// this.addItem("X"); +// this.addItem("Y"); +// this.addItem("Z"); +// this.addItem("1"); +// this.addItem("2"); +// this.addItem("3"); +// this.addItem("4"); +// this.addItem("5"); +// this.addItem("6"); +// this.addItem("7"); +// this.addItem("8"); +// this.addItem("9"); +// this.addItem("0"); +// this.addItem("ARROW LEFT"); +// this.addItem("ARROW UP"); +// this.addItem("THEC64"); +// this.addItem(", (Comma)"); +// this.addItem("CTRL"); +// this.addItem("Cursor Up"); +// this.addItem("Cursor Down"); +// this.addItem("Cursor Left"); +// this.addItem("Cursor Right"); +// this.addItem("INST/DEL"); +// this.addItem("RETURN"); +// this.addItem("CLR/HOME"); +// this.addItem("RUN/STOP"); +// this.addItem("RESTORE"); +// this.addItem("Left SHIFT"); +// this.addItem("Right SHIFT"); +// this.addItem("SHIFT LOCK"); +// this.addItem("SPACE"); +// this.addItem("£ (Pound)"); +// // Codes not matching the text +// codeMap.put("", "----"); +// codeMap.put("JU", "Up"); +// codeMap.put("JD", "Down"); +// codeMap.put("JL", "Left"); +// codeMap.put("JR", "Right"); +// codeMap.put("JF", "Fire"); +// codeMap.put("AL", "ARROW LEFT"); +// codeMap.put("AU", "ARROW UP"); +// codeMap.put("CM", "THEC64"); +// codeMap.put("CO", ", (Comma)"); +// codeMap.put("CT", "CTRL"); +// codeMap.put("CU", "Cursor Up"); +// codeMap.put("CD", "Cursor Down"); +// codeMap.put("CL", "Cursor Left"); +// codeMap.put("CR", "Cursor Right"); +// codeMap.put("DL", "INST/DEL"); +// codeMap.put("EN", "RETURN"); +// codeMap.put("HM", "CLR/HOME"); +// codeMap.put("RS", "RUN/STOP"); +// codeMap.put("RE", "RESTORE"); +// codeMap.put("SL", "Left SHIFT"); +// codeMap.put("SR", "Right SHIFT"); +// codeMap.put("SS", "SHIFT LOCK"); +// codeMap.put("SP", "SPACE"); +// codeMap.put("PO", "£ (Pound)"); } public void setSelectedCode(String code) diff --git a/src/main/java/se/lantz/gui/MainPanel.java b/src/main/java/se/lantz/gui/MainPanel.java index aebf57f..56f0f9d 100644 --- a/src/main/java/se/lantz/gui/MainPanel.java +++ b/src/main/java/se/lantz/gui/MainPanel.java @@ -20,6 +20,7 @@ import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; import se.lantz.gui.gameview.GameViewManager; import se.lantz.model.MainViewModel; @@ -157,10 +158,10 @@ public class MainPanel extends JPanel }; list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); - list.addListSelectionListener((e) -> { - if (e.getValueIsAdjusting() == false) + list.addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { - getGameDetailsBackgroundPanel().updateSelectedGame(list.getSelectedValue()); + SwingUtilities.invokeLater(() -> getGameDetailsBackgroundPanel().updateSelectedGame(list.getSelectedValue())); } }); list.setModel(uiModel.getGameListModel()); diff --git a/src/main/java/se/lantz/model/JoystickModel.java b/src/main/java/se/lantz/model/JoystickModel.java index 6948d54..1672f47 100644 --- a/src/main/java/se/lantz/model/JoystickModel.java +++ b/src/main/java/se/lantz/model/JoystickModel.java @@ -4,7 +4,9 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; public class JoystickModel extends AbstractModel @@ -16,10 +18,98 @@ public class JoystickModel extends AbstractModel private List configList = new ArrayList<>(); private ActionListener primaryListener; + private Map keyCodeMap = new HashMap<>(); + private List keyCodeList = new ArrayList<>(); + public JoystickModel(boolean port1) { this.port1 = port1; + setupKeyKodes(); + } + private void setupKeyKodes() + { + keyCodeList.add("F1"); + keyCodeList.add("F2"); + keyCodeList.add("F3"); + keyCodeList.add("F4"); + keyCodeList.add("F5"); + keyCodeList.add("F6"); + keyCodeList.add("F7"); + keyCodeList.add("F8"); + keyCodeList.add("A"); + keyCodeList.add("B"); + keyCodeList.add("C"); + keyCodeList.add("D"); + keyCodeList.add("E"); + keyCodeList.add("F"); + keyCodeList.add("G"); + keyCodeList.add("H"); + keyCodeList.add("I"); + keyCodeList.add("J"); + keyCodeList.add("K"); + keyCodeList.add("L"); + keyCodeList.add("M"); + keyCodeList.add("N"); + keyCodeList.add("O"); + keyCodeList.add("P"); + keyCodeList.add("Q"); + keyCodeList.add("R"); + keyCodeList.add("S"); + keyCodeList.add("T"); + keyCodeList.add("U"); + keyCodeList.add("V"); + keyCodeList.add("W"); + keyCodeList.add("X"); + keyCodeList.add("Y"); + keyCodeList.add("Z"); + keyCodeList.add("1"); + keyCodeList.add("2"); + keyCodeList.add("3"); + keyCodeList.add("4"); + keyCodeList.add("5"); + keyCodeList.add("6"); + keyCodeList.add("7"); + keyCodeList.add("8"); + keyCodeList.add("9"); + keyCodeList.add("0"); + + // Codes not matching the text + keyCodeMap.put("", "----"); + keyCodeMap.put("JU", "Up"); + keyCodeMap.put("JD", "Down"); + keyCodeMap.put("JL", "Left"); + keyCodeMap.put("JR", "Right"); + keyCodeMap.put("JF", "Fire"); + keyCodeMap.put("AL", "ARROW LEFT"); + keyCodeMap.put("AU", "ARROW UP"); + keyCodeMap.put("CM", "THEC64"); + keyCodeMap.put("CO", ", (Comma)"); + keyCodeMap.put("CT", "CTRL"); + keyCodeMap.put("CU", "Cursor Up"); + keyCodeMap.put("CD", "Cursor Down"); + keyCodeMap.put("CL", "Cursor Left"); + keyCodeMap.put("CR", "Cursor Right"); + keyCodeMap.put("DL", "INST/DEL"); + keyCodeMap.put("EN", "RETURN"); + keyCodeMap.put("HM", "CLR/HOME"); + keyCodeMap.put("RS", "RUN/STOP"); + keyCodeMap.put("RE", "RESTORE"); + keyCodeMap.put("SL", "Left SHIFT"); + keyCodeMap.put("SR", "Right SHIFT"); + keyCodeMap.put("SS", "SHIFT LOCK"); + keyCodeMap.put("SP", "SPACE"); + keyCodeMap.put("PO", "£ (Pound)"); + } + + public List getKeyCodeList() + { + return keyCodeList; + } + + public Map getKeyCodeMap() + { + return keyCodeMap; } public String getConfigString() @@ -75,37 +165,46 @@ public class JoystickModel extends AbstractModel public void setConfigString(String configString) { + disableChangeNotification(true); + String definitions = configString; // Set all other fields based on configString String[] colonSplit = configString.split(":"); - if (colonSplit.length != 3) + if (colonSplit.length == 3) { - throw new IllegalStateException("Invalid config string"); + definitions = colonSplit[2]; + setPrimary(colonSplit[1].contains("*")); } - configList.clear(); - configList = new ArrayList<>(Arrays.asList(colonSplit[2].split(","))); - while (configList.size() < 15) + ArrayList newConfigList = new ArrayList<>(Arrays.asList(definitions.split(","))); + while (newConfigList.size() < 15) { - configList.add(""); + newConfigList.add(""); } - disableChangeNotification(true); - setUp(configList.get(0)); - setDown(configList.get(1)); - setLeft(configList.get(2)); - setRight(configList.get(3)); - setLeftFire(configList.get(4)); - setRightFire(configList.get(5)); - setTl(configList.get(6)); - setTr(configList.get(7)); - setUnused1(configList.get(8)); - setA(configList.get(9)); - setB(configList.get(10)); - setC(configList.get(11)); - setUnused2(configList.get(12)); - setUnused3(configList.get(13)); - setUnused4(configList.get(14)); + //Validate all entries + for (int i = 0; i < newConfigList.size(); i++) + { + String value = newConfigList.get(i); + if (!keyCodeList.contains(value) && !keyCodeMap.keySet().contains(value)) + { + newConfigList.set(i, ""); + } + } + setUp(newConfigList.get(0)); + setDown(newConfigList.get(1)); + setLeft(newConfigList.get(2)); + setRight(newConfigList.get(3)); + setLeftFire(newConfigList.get(4)); + setRightFire(newConfigList.get(5)); + setTl(newConfigList.get(6)); + setTr(newConfigList.get(7)); + setUnused1(newConfigList.get(8)); + setA(newConfigList.get(9)); + setB(newConfigList.get(10)); + setC(newConfigList.get(11)); + setUnused2(newConfigList.get(12)); + setUnused3(newConfigList.get(13)); + setUnused4(newConfigList.get(14)); - setPrimary(colonSplit[1].contains("*")); disableChangeNotification(false); notifyChange(); } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 7c2db34..815d2c3 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,30 +1,34 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - pcusb.log - true - - true - - pcusb-%d{yyyy-MM-dd}.log - 30 - 1Mb - - - 1MB - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + pcusb.log + + pcusb-%d{yyyy-MM-dd}_%i.log + 5 + 30MB + + + 5MB + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file