diff --git a/client/src/main/java/ru/trader/KeyBinding.java b/client/src/main/java/ru/trader/KeyBinding.java index 41c69b0..4c02ae2 100644 --- a/client/src/main/java/ru/trader/KeyBinding.java +++ b/client/src/main/java/ru/trader/KeyBinding.java @@ -4,17 +4,30 @@ import com.tulskiy.keymaster.common.HotKeyListener; import com.tulskiy.keymaster.common.Provider; import javax.swing.*; +import java.util.HashMap; +import java.util.Map; public class KeyBinding { private final static Provider provider = Provider.getCurrentProvider(false); + private final static Map hotKeys = new HashMap<>(10, 0.9f); public static void bind(KeyStroke keys, HotKeyListener listener){ + if (keys == null) return; provider.register(keys, listener); + hotKeys.put(keys, listener); + } + + public static void unbind(KeyStroke hotKey){ + if (hotKey == null) return; + provider.reset(); + hotKeys.remove(hotKey); + hotKeys.forEach(provider::register); } public static void unbind(){ provider.reset(); provider.stop(); + hotKeys.clear(); } diff --git a/client/src/main/java/ru/trader/Settings.java b/client/src/main/java/ru/trader/Settings.java index 0f1b968..3ff1ff4 100644 --- a/client/src/main/java/ru/trader/Settings.java +++ b/client/src/main/java/ru/trader/Settings.java @@ -8,6 +8,7 @@ import ru.trader.core.MarketFilter; import ru.trader.core.Profile; import ru.trader.core.Ship; +import javax.swing.*; import java.io.*; import java.util.Locale; import java.util.Properties; @@ -227,11 +228,13 @@ public class Settings { private final IntegerProperty x; private final IntegerProperty y; private final BooleanProperty visible; + private final ObjectProperty completeKey; public HelperSettings() { x = new SimpleIntegerProperty(); y = new SimpleIntegerProperty(); visible = new SimpleBooleanProperty(); + completeKey = new SimpleObjectProperty<>(); } public int getX() { @@ -270,16 +273,30 @@ public class Settings { this.visible.set(visible); } + public KeyStroke getCompleteKey() { + return completeKey.get(); + } + + public ObjectProperty completeKeyProperty() { + return completeKey; + } + + public void setCompleteKey(KeyStroke completeKey) { + this.completeKey.set(completeKey); + } + public void readFrom(Properties values){ setVisible(!"0".equals(values.getProperty("helper.visible", "0"))); setX(Integer.valueOf(values.getProperty("helper.x", "100"))); setY(Integer.valueOf(values.getProperty("helper.y", "100"))); + setCompleteKey(KeyStroke.getKeyStroke(values.getProperty("helper.keys.complete", "pressed END"))); } public void writeTo(Properties values){ values.setProperty("helper.visible", isVisible() ? "1":"0"); values.setProperty("helper.x", String.valueOf(getX())); values.setProperty("helper.y", String.valueOf(getY())); + values.setProperty("helper.keys.complete", String.valueOf(getCompleteKey())); } } diff --git a/client/src/main/java/ru/trader/controllers/HelperController.java b/client/src/main/java/ru/trader/controllers/HelperController.java index 5acaec7..2b532d7 100644 --- a/client/src/main/java/ru/trader/controllers/HelperController.java +++ b/client/src/main/java/ru/trader/controllers/HelperController.java @@ -25,7 +25,6 @@ import ru.trader.view.support.cells.OrderListCell; import ru.trader.view.support.cells.StationListCell; import javax.swing.*; -import java.awt.event.KeyEvent; public class HelperController { @@ -167,17 +166,20 @@ public class HelperController { ProfileModel profile = MainController.getProfile(); profile.routeProperty().addListener(routeListener); profile.dockedProperty().addListener(dockedListener); + Main.SETTINGS.helper().completeKeyProperty().addListener(completeKeyListener); Main.SETTINGS.helper().xProperty().bind(stage.xProperty()); Main.SETTINGS.helper().yProperty().bind(stage.yProperty()); - bindKeys(); + bindKeys(Main.SETTINGS.helper().getCompleteKey()); } private void unbind(){ ProfileModel profile = MainController.getProfile(); profile.routeProperty().removeListener(routeListener); profile.dockedProperty().removeListener(dockedListener); + Main.SETTINGS.helper().completeKeyProperty().removeListener(completeKeyListener); Main.SETTINGS.helper().xProperty().unbind(); Main.SETTINGS.helper().yProperty().unbind(); + KeyBinding.unbind(Main.SETTINGS.helper().getCompleteKey()); } private void setRoute(RouteModel route){ @@ -267,13 +269,21 @@ public class HelperController { Main.copyToClipboard(system.getText()); } - private void bindKeys(){ - KeyBinding.bind(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), k -> ViewUtils.doFX(this::complete)); + private void bindKeys(KeyStroke completeKey){ + KeyBinding.bind(completeKey, k -> ViewUtils.doFX(this::complete)); } private final ChangeListener currentEntryListener = (ov, o, n) -> ViewUtils.doFX(() -> setRouteEntry(n.intValue())); private final ChangeListener dockedListener = (ov, o, n) -> ViewUtils.doFX(() -> setDocked(n)); private final ChangeListener routeListener = (ov, o, n) -> ViewUtils.doFX(() -> setRoute(n)); + private final ChangeListener completeKeyListener = (ov, o, n) -> { + if (o != null){ + KeyBinding.unbind(o); + } + if (n != null){ + bindKeys(n); + } + }; private void addDragListeners(final Node node){ new DragListener(node); diff --git a/client/src/main/java/ru/trader/controllers/SettingsController.java b/client/src/main/java/ru/trader/controllers/SettingsController.java index 9843114..8a3f579 100644 --- a/client/src/main/java/ru/trader/controllers/SettingsController.java +++ b/client/src/main/java/ru/trader/controllers/SettingsController.java @@ -4,13 +4,18 @@ import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.Parent; import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.Main; import ru.trader.core.Profile; import ru.trader.view.support.Localization; import ru.trader.view.support.NumberField; +import ru.trader.view.support.ViewUtils; +import javax.swing.*; +import java.awt.event.InputEvent; public class SettingsController { private final static Logger LOG = LoggerFactory.getLogger(SettingsController.class); @@ -48,11 +53,31 @@ public class SettingsController { @FXML private NumberField edceInterval; + @FXML + private TextField completeKeyText; + private KeyStroke completeKey; + private Dialog dlg; @FXML private void initialize(){ pathPriority.setItems(FXCollections.observableArrayList(Profile.PATH_PRIORITY.values())); + completeKeyText.setOnKeyReleased(KeyEvent::consume); + completeKeyText.setOnKeyTyped(KeyEvent::consume); + completeKeyText.setOnKeyPressed(e -> { + if (e.getCode().equals(KeyCode.ESCAPE)) { + completeKey = null; + completeKeyText.setText(""); + } else { + int modifiers = 0; + if (e.isAltDown()) modifiers |= InputEvent.ALT_DOWN_MASK; + if (e.isShiftDown()) modifiers |= InputEvent.SHIFT_DOWN_MASK; + if (e.isControlDown()) modifiers |= InputEvent.CTRL_DOWN_MASK; + completeKey = KeyStroke.getKeyStroke(e.getCode().impl_getCode(), modifiers); + completeKeyText.setText(ViewUtils.keyToString(completeKey)); + } + e.consume(); + }); init(); } @@ -77,6 +102,8 @@ public class SettingsController { edceActive.setSelected(Main.SETTINGS.edce().isActive()); edceInterval.setValue(Main.SETTINGS.edce().getInterval()); + + completeKeyText.setText(ViewUtils.keyToString(Main.SETTINGS.helper().getCompleteKey())); } private void createDialog(Parent owner, Parent content){ @@ -120,6 +147,8 @@ public class SettingsController { Main.SETTINGS.edce().setActive(edceActive.isSelected()); Main.SETTINGS.edce().setInterval(edceInterval.getValue().intValue()); + + Main.SETTINGS.helper().setCompleteKey(completeKey); } public void showDialog(Parent parent, Parent content){ diff --git a/client/src/main/java/ru/trader/view/support/ViewUtils.java b/client/src/main/java/ru/trader/view/support/ViewUtils.java index 8b20e90..021c7a8 100644 --- a/client/src/main/java/ru/trader/view/support/ViewUtils.java +++ b/client/src/main/java/ru/trader/view/support/ViewUtils.java @@ -10,6 +10,10 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TablePosition; import javafx.scene.control.TableView; +import javax.swing.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + public class ViewUtils { //Scroll to row if invisible @@ -69,4 +73,28 @@ public class ViewUtils { public static String stationDistanceToString(double distance){ return String.format("%.2f Ls", distance); } + + public static String keyToString(KeyStroke key){ + if (key == null) return ""; + if (key.getKeyCode() == KeyEvent.VK_SHIFT + || key.getKeyCode() == KeyEvent.VK_CONTROL + || key.getKeyCode() == KeyEvent.VK_ALT + || key.getKeyCode() == KeyEvent.VK_ALT_GRAPH){ + return KeyEvent.getKeyText(key.getKeyCode()); + } + StringBuilder buf = new StringBuilder(); + int modifiers = key.getModifiers(); + if ((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0 ) { + buf.append("SHIFT+"); + } + if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0 ) { + buf.append("CTRL+"); + } + if ((modifiers & InputEvent.ALT_DOWN_MASK) != 0 ) { + buf.append("ALT+"); + } + buf.append(KeyEvent.getKeyText(key.getKeyCode())); + return buf.toString(); + } + } diff --git a/client/src/main/resources/view/settings.fxml b/client/src/main/resources/view/settings.fxml index bd6edd8..cdc743f 100644 --- a/client/src/main/resources/view/settings.fxml +++ b/client/src/main/resources/view/settings.fxml @@ -43,6 +43,9 @@