From 392f8283047ab67078788a38e336b4d097118d0a Mon Sep 17 00:00:00 2001 From: Andy Till Date: Wed, 12 Aug 2015 21:40:22 +0100 Subject: [PATCH] #13 ctrl+f to iterate focus between the filter fields --- README.md | 13 +-- pom.xml | 2 +- src/main/java/erlyberly/DbgTraceView.java | 6 ++ src/main/java/erlyberly/DbgView.java | 5 ++ src/main/java/erlyberly/ErlyBerly.java | 2 + .../java/erlyberly/FilterFocusManager.java | 90 +++++++++++++++++++ src/main/java/erlyberly/ProcView.java | 6 ++ 7 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 src/main/java/erlyberly/FilterFocusManager.java diff --git a/README.md b/README.md index 1552d3a..b5c82d5 100644 --- a/README.md +++ b/README.md @@ -119,11 +119,12 @@ Tested on Ubuntu and Windows 7/8. Also seen on [OS X](http://t.co/kzXppo5GEt). ### Shortcuts -| Keys | Action | -| -------- | :----------------------------------------------------------: | -| `ctrl+m` | Toggle visibility of modules and functions. | -| `ctrl+p` | Toggle visibility of processes. | -| `ctrl+t` | Toggle tracing for the selected function in the module tree. | +| Keys | Action | +| -------- | :----------------------------------------------------------------------------: | +| `ctrl+f` | Focus on the last focused filter field, or the next if one is already focused. | +| `ctrl+m` | Toggle visibility of modules and functions. | +| `ctrl+p` | Toggle visibility of processes. | +| `ctrl+t` | Toggle tracing for the selected function in the module tree. | ### How to get it @@ -142,7 +143,7 @@ erlyberly must have epmd running on the machine as it is running. Otherwise it You will need JDK 8 and Maven to compile. erlyberly loads an erlang module to the remote node and then uses RPC to run traces and collect stats. For convenience I have bundled the beam code in the source as well as the original erlang source. If you want to recompile the beam code for yourself run the following command from the project directory: - erlc -o src/main/resources/erlyberly/beam/ src/main/resources/erlyberly/beam/erlyberly.erl + erlc +debug_info -o src/main/resources/erlyberly/beam/ src/main/resources/erlyberly/beam/erlyberly.erl Install Maven dependencies that are not in Maven Central. diff --git a/pom.xml b/pom.xml index 5f2c17d..cb0eb41 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ andytill erlyberly - 0.6.4 + 0.6.5 jar erlyberly diff --git a/src/main/java/erlyberly/DbgTraceView.java b/src/main/java/erlyberly/DbgTraceView.java index 0759564..cd2c46c 100644 --- a/src/main/java/erlyberly/DbgTraceView.java +++ b/src/main/java/erlyberly/DbgTraceView.java @@ -1,5 +1,6 @@ package erlyberly; +import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; import javafx.beans.value.WeakChangeListener; @@ -15,6 +16,7 @@ import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; +import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.OverrunStyle; import javafx.scene.control.SelectionMode; @@ -284,6 +286,10 @@ private FxmlLoadable addTraceLogFloatySearchControl(HBox traceLogSearchBox) { ffView.textProperty().addListener((o, ov, nv) -> { onTraceFilterChange(nv); }); + Platform.runLater(() -> { + FilterFocusManager.addFilter((Control) loader.fxmlNode.getChildrenUnmodifiable().get(1), 2); + }); + return loader; } diff --git a/src/main/java/erlyberly/DbgView.java b/src/main/java/erlyberly/DbgView.java index 433738a..fbba519 100644 --- a/src/main/java/erlyberly/DbgView.java +++ b/src/main/java/erlyberly/DbgView.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.ResourceBundle; +import javafx.application.Platform; import javafx.beans.Observable; import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; @@ -15,6 +16,7 @@ import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.SplitPane; import javafx.scene.control.SplitPane.Divider; @@ -115,6 +117,9 @@ private FxmlLoadable addModulesFloatySearchControl() { ffView.textProperty().addListener(this::onFunctionSearchChange); + Platform.runLater(() -> { + FilterFocusManager.addFilter((Control) loader.fxmlNode.getChildrenUnmodifiable().get(1), 1); + }); return loader; } diff --git a/src/main/java/erlyberly/ErlyBerly.java b/src/main/java/erlyberly/ErlyBerly.java index 8c0705c..a44cc96 100644 --- a/src/main/java/erlyberly/ErlyBerly.java +++ b/src/main/java/erlyberly/ErlyBerly.java @@ -78,6 +78,8 @@ public void start(Stage primaryStage) { primaryStage.show(); displayConnectionPopup(primaryStage); + + FilterFocusManager.init(scene); } public static void applyCssToWIndow(Scene scene) { diff --git a/src/main/java/erlyberly/FilterFocusManager.java b/src/main/java/erlyberly/FilterFocusManager.java new file mode 100644 index 0000000..f2b63b1 --- /dev/null +++ b/src/main/java/erlyberly/FilterFocusManager.java @@ -0,0 +1,90 @@ +package erlyberly; + +import java.util.ArrayList; + +import javafx.application.Platform; +import javafx.scene.Scene; +import javafx.scene.control.Control; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; + +public class FilterFocusManager { + + private static final KeyCodeCombination REFRESH_MODULES_SHORTCUT = new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN); + + private static final ArrayList filters = new ArrayList<>(); + + private static int lastFocusedIndex = -1; + + public static void init(Scene scene) { + filters.add(null); + filters.add(null); + filters.add(null); + + Platform.runLater(() -> { + scene.getAccelerators().put(REFRESH_MODULES_SHORTCUT, () -> { nextFilter(); }); + }); + } + + private static void nextFilter() { + if(filters.isEmpty()) + return; + + Control control = findNextFilter(); + + requestFocus(control); + } + + private static Control findNextFilter() { + if(lastFocusedIndex != -1) { + Control lastFocused = filters.get(lastFocusedIndex); + if(!lastFocused.isFocused()) { + return lastFocused; + } + } + + int focused = findCurrentFilter(); + + if(focused == -1) { + focused = 0; + } + else { + focused++; + if(focused >= filters.size()) { + focused = 0; + } + } + + return filters.get(focused); + } + + private static int findCurrentFilter() { + int focused = -1; + for (int i = 0; i < filters.size(); i++) { + Control control = filters.get(i); + if(control != null && control.isFocused()) { + focused = i; + break; + } + } + return focused; + } + + private static void requestFocus(Control control) { + if(control != null) + Platform.runLater(() -> { control.requestFocus(); }); + } + + public static void addFilter(Control control, int order) { + assert control != null; + assert order >= 0; + assert Platform.isFxApplicationThread(); + + filters.set(order, control); + + control.focusedProperty().addListener((o, oldFocus, newFocus) -> { + lastFocusedIndex = order; + }); + } +} diff --git a/src/main/java/erlyberly/ProcView.java b/src/main/java/erlyberly/ProcView.java index 013a32c..ba7506d 100644 --- a/src/main/java/erlyberly/ProcView.java +++ b/src/main/java/erlyberly/ProcView.java @@ -3,6 +3,7 @@ import java.net.URL; import java.util.ResourceBundle; +import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.binding.BooleanBinding; @@ -17,6 +18,7 @@ import javafx.scene.chart.PieChart.Data; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; +import javafx.scene.control.Control; import javafx.scene.control.MenuItem; import javafx.scene.control.SelectionMode; import javafx.scene.control.Separator; @@ -159,6 +161,10 @@ private FxmlLoadable addFloatySearchControl() { procController.filterProperty().bind(ffView.textProperty()); + Platform.runLater(() -> { + FilterFocusManager.addFilter((Control) loader.fxmlNode.getChildrenUnmodifiable().get(1), 0); + }); + return loader; }