From b58a76cdde17894106b9230566d2dc1dc0f10b3f Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Wed, 10 Aug 2016 20:13:46 +0200
Subject: [PATCH] Add function to delete key shortcuts from menu

fixed bug when mapping key shortcuts to action
---
 .../playpad/assets/lang/ui_de.properties      |  1 +
 .../assets/view/option/global/keysTab.fxml    |  1 +
 .../option/global/KeysTabViewController.java  | 30 ++++++++++++++++++-
 .../de/tobias/playpad/settings/keys/Key.java  |  6 +++-
 .../playpad/settings/keys/KeyCollection.java  | 21 +++++++++++++
 5 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties b/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties
index 7611aa26..743131ff 100644
--- a/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties
+++ b/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties
@@ -84,6 +84,7 @@ settings.keys.label.headline=Tastenkombinationen
 settings.keys.label.name=Name:
 settings.keys.label.shortcut=Kurzbefehl:
 settings.keys.button.change=Neu
+settings.keys.button.delete=Verbindung aufheben
 settings.keys.table.name=Name
 settings.keys.table.shortcut=Kurzbefehl
 settings.keys.textfieldsearch=Suchen...
diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml
index 5c068743..212bd549 100644
--- a/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml
+++ b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml
@@ -27,6 +27,7 @@
             <Label alignment="CENTER_RIGHT" prefWidth="150.0" text="%settings.keys.label.shortcut" />
             <Label fx:id="shortcutLabel" prefWidth="100.0" />
             <Button fx:id="newShortcutButton" mnemonicParsing="false" onAction="#newShortcutButtonHandler" text="%settings.keys.button.change" />
+            <Button fx:id="deleteButton" mnemonicParsing="false" onAction="#deleteHandler" text="%settings.keys.button.delete" />
          </children>
       </HBox>
    </children>
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
index 1f2cc618..c6132c91 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
@@ -24,6 +24,7 @@ import javafx.scene.control.Button;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.Label;
 import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableRow;
 import javafx.scene.control.TableView;
 import javafx.scene.control.TextField;
 import javafx.scene.input.KeyCode;
@@ -40,6 +41,7 @@ public class KeysTabViewController extends GlobalSettingsTabViewController {
 	@FXML private Label nameLabel;
 	@FXML private Label shortcutLabel;
 	@FXML private Button newShortcutButton;
+	@FXML private Button deleteButton;
 
 	private Key currentKey;
 	private ObservableList<Key> keys = FXCollections.observableArrayList();
@@ -65,6 +67,20 @@ public class KeysTabViewController extends GlobalSettingsTabViewController {
 			setDetailView(c);
 		});
 		searchTextField.textProperty().addListener((a, b, c) -> search());
+
+		table.setRowFactory(tv ->
+		{
+			TableRow<Key> row = new TableRow<>();
+			row.setOnMouseClicked(event ->
+			{
+				if (event.getClickCount() == 2 && (!row.isEmpty())) {
+					setDetailView(row.getItem());
+					showNewKeyBindingDialog();
+				}
+			});
+			return row;
+		});
+
 	}
 
 	private void setDetailView(Key key) {
@@ -87,6 +103,18 @@ public class KeysTabViewController extends GlobalSettingsTabViewController {
 
 	@FXML
 	void newShortcutButtonHandler(ActionEvent event) {
+		showNewKeyBindingDialog();
+	}
+
+	@FXML
+	void deleteHandler(ActionEvent event) {
+		if (currentKey != null) {
+			GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings();
+			globalSettings.getKeyCollection().removeKeyBinding(currentKey);
+		}
+	}
+
+	private void showNewKeyBindingDialog() {
 		Alert alert = new Alert(AlertType.NONE);
 		alert.setContentText(Localization.getString(Strings.UI_Settings_Alert_NewKeyShortcut_Text));
 		Scene scene = alert.getDialogPane().getScene();
@@ -96,7 +124,7 @@ public class KeysTabViewController extends GlobalSettingsTabViewController {
 			if (ev.getCode().isModifierKey()) {
 				return;
 			}
-			
+
 			boolean macCondition = ev.getCode().isLetterKey() || ev.getCode().isKeypadKey() || ev.getCode().isDigitKey()
 					|| ev.getCode().isFunctionKey() || ev.getCode() == KeyCode.PERIOD || ev.getCode() == KeyCode.COMMA;
 
diff --git a/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java b/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java
index da58fd57..7ae9e3c5 100644
--- a/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java
+++ b/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java
@@ -106,7 +106,11 @@ public class Key implements Displayable {
 	@Override
 	public String toString() {
 		if (!getKeyCode().isEmpty())
-			return KeyCombination.valueOf(getKeyCode()).getDisplayText();
+			try {
+				return KeyCombination.valueOf(getKeyCode()).getDisplayText();
+			} catch (IllegalArgumentException e) {
+				return "";
+			}
 		else
 			return "";
 	}
diff --git a/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java
index a547fc2c..f47a1e5f 100644
--- a/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java
+++ b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java
@@ -13,6 +13,13 @@ import org.dom4j.io.SAXReader;
 import de.tobias.playpad.xml.XMLHandler;
 import de.tobias.utils.util.OS;
 
+/**
+ * Verwaltung der Tastenkombinationen für das Menu.
+ * 
+ * @author tobias
+ *
+ * @since 5.1.0
+ */
 public class KeyCollection {
 
 	// Schlüssel: ID, Value: Key
@@ -44,6 +51,20 @@ public class KeyCollection {
 		return keys.values();
 	}
 
+	/**
+	 * Löscht eine Tastenkombination.
+	 * 
+	 * @param key
+	 *            Key
+	 */
+	public void removeKeyBinding(Key key) {
+		key.setAlt(false);
+		key.setCtrl(false);
+		key.setMeta(false);
+		key.setShift(false);
+		key.setKey("");
+	}
+
 	public boolean keysConflict(Key key) {
 		for (Key k : keys.values()) {
 			if (k.getKeyCode().equals(key.getKeyCode())) {
-- 
GitLab