From 9ad6c958429c6aa07e87ba3aef74d2cddcd53dd3 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Sun, 18 Aug 2019 14:10:51 -0400 Subject: [PATCH] usability; right-click menu --- .../io/src/com/rusefi/io/CommandQueue.java | 3 +- .../src/com/rusefi/core/EngineState.java | 3 +- java_console/ui/src/com/rusefi/Launcher.java | 2 +- .../ui/src/com/rusefi/ui/MessagesPanel.java | 24 ++--- .../ui/src/com/rusefi/ui/MessagesView.java | 88 +++++++++++++++++-- 5 files changed, 93 insertions(+), 27 deletions(-) diff --git a/java_console/io/src/com/rusefi/io/CommandQueue.java b/java_console/io/src/com/rusefi/io/CommandQueue.java index ca231e0bbb..b6290029df 100644 --- a/java_console/io/src/com/rusefi/io/CommandQueue.java +++ b/java_console/io/src/com/rusefi/io/CommandQueue.java @@ -22,6 +22,7 @@ public class CommandQueue { public static final int DEFAULT_TIMEOUT = 500; private static final int COMMAND_CONFIRMATION_TIMEOUT = 1000; public static final int SLOW_CONFIRMATION_TIMEOUT = 5000; + public static final Class COMMAND_QUEUE_CLASS = CommandQueue.class; private final Object lock = new Object(); /** * One complex use-case is when we send out a bunch of commands and then we need to handle all the configurations @@ -38,7 +39,7 @@ public class CommandQueue { @SuppressWarnings("InfiniteLoopStatement") @Override public void run() { - MessagesCentral.getInstance().postMessage(CommandQueue.class, "SerialIO started"); + MessagesCentral.getInstance().postMessage(COMMAND_QUEUE_CLASS, "SerialIO started"); while (true) { try { sendPendingCommand(); diff --git a/java_console/models/src/com/rusefi/core/EngineState.java b/java_console/models/src/com/rusefi/core/EngineState.java index 65200a61f4..79c85e957b 100644 --- a/java_console/models/src/com/rusefi/core/EngineState.java +++ b/java_console/models/src/com/rusefi/core/EngineState.java @@ -18,6 +18,7 @@ import java.util.concurrent.CopyOnWriteArrayList; public class EngineState { public static final String SEPARATOR = ","; public static final String PACKING_DELIMITER = ":"; + public static final Class ENGINE_STATE_CLASS = EngineState.class; private final Object lock = new Object(); public void replaceStringValueAction(String key, ValueCallback callback) { @@ -68,7 +69,7 @@ public class EngineState { registerStringValueAction("msg", new ValueCallback() { @Override public void onUpdate(String value) { - MessagesCentral.getInstance().postMessage(EngineState.class, value); + MessagesCentral.getInstance().postMessage(ENGINE_STATE_CLASS, value); } }); diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index ec7f65b748..285a986a43 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -48,7 +48,7 @@ import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; * @see EngineSnifferPanel */ public class Launcher { - public static final int CONSOLE_VERSION = 20190815; + public static final int CONSOLE_VERSION = 20190818; public static final String INPUT_FILES_PATH = System.getProperty("input_files_path", ".."); public static final String TOOLS_PATH = System.getProperty("tools_path", "."); private static final String TAB_INDEX = "main_tab"; diff --git a/java_console/ui/src/com/rusefi/ui/MessagesPanel.java b/java_console/ui/src/com/rusefi/ui/MessagesPanel.java index 718f739d49..c4b6c62631 100644 --- a/java_console/ui/src/com/rusefi/ui/MessagesPanel.java +++ b/java_console/ui/src/com/rusefi/ui/MessagesPanel.java @@ -6,8 +6,6 @@ import com.rusefi.ui.widgets.AnyCommand; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * This panel displays plain-text 'msg' plain-text debug messages @@ -32,20 +30,12 @@ public class MessagesPanel { // buttonPanel.setBorder(BorderFactory.createLineBorder(Color.cyan)); final JButton pauseButton = UiUtils.createPauseButton(); - pauseButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - setPaused(pauseButton, !messagesView.isPaused); - } - }); + pauseButton.addActionListener(event -> setPaused(pauseButton, !messagesView.isPaused())); JButton clearButton = UiUtils.createClearButton(); - clearButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - messagesView.clear(); - setPaused(pauseButton, false); - } + clearButton.addActionListener(event -> { + messagesView.clear(); + setPaused(pauseButton, false); }); buttonPanel.add(clearButton); @@ -55,8 +45,8 @@ public class MessagesPanel { } private void setPaused(JButton pauseButton, boolean isPaused) { - messagesView.isPaused = isPaused; - UiUtils.setPauseButtonText(pauseButton, messagesView.isPaused); + messagesView.setPaused(isPaused); + UiUtils.setPauseButtonText(pauseButton, messagesView.isPaused()); } public JPanel getButtonPanel() { @@ -81,6 +71,6 @@ public class MessagesPanel { Font f = getFont(); int size = config.getIntProperty(FONT_SIZE, f.getSize()); String name = config.getProperty(FONT_NAME, f.getName()); - setFont(new Font(f.getName(), f.getStyle(), size), config); + setFont(new Font(name, f.getStyle(), size), config); } } diff --git a/java_console/ui/src/com/rusefi/ui/MessagesView.java b/java_console/ui/src/com/rusefi/ui/MessagesView.java index 7405dc8b4c..ac7e859b6e 100644 --- a/java_console/ui/src/com/rusefi/ui/MessagesView.java +++ b/java_console/ui/src/com/rusefi/ui/MessagesView.java @@ -1,21 +1,28 @@ package com.rusefi.ui; import com.rusefi.FileLog; +import com.rusefi.core.EngineState; import com.rusefi.core.MessagesCentral; import com.rusefi.io.CommandQueue; -import com.rusefi.io.serial.PortHolder; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.text.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.text.SimpleDateFormat; import java.util.Date; public class MessagesView { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(FileLog.DATE_PATTERN); private static final int MAX_SIZE = 50000; + private final Style bold; private final Style italic; - protected boolean isPaused; + + private boolean isPaused; protected final JTextPane messages = new JTextPane() { @Override @@ -29,6 +36,26 @@ public class MessagesView { public MessagesView() { messages.setEditable(false); + + JPopupMenu menu = createPopupMenu(); + + messages.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + pop(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + pop(e); + } + + private void pop(MouseEvent e) { + if (e.isPopupTrigger()) + menu.show(e.getComponent(), e.getX(), e.getY()); + } + }); + StyledDocument d = (StyledDocument) messages.getDocument(); bold = d.addStyle("StyleName", null); bold.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE); @@ -46,6 +73,43 @@ public class MessagesView { }); } + @NotNull + private JPopupMenu createPopupMenu() { + JPopupMenu menu = new JPopupMenu(); + + /* + JMenuItem selectAll = new JMenuItem("Select All"); + selectAll.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + messages.selectAll(); + } + }); + menu.add(selectAll); +does not work? maybe wrong UI colors since control is not editable? +*/ + JMenuItem copy = new JMenuItem("Copy"); + copy.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + messages.copy(); + } + }); + menu.add(copy); + + menu.add(new JPopupMenu.Separator()); + + JMenuItem pause = new JMenuItem("Pause/Resume"); + pause.addActionListener(e -> setPaused(!isPaused)); + menu.add(pause); + + JMenuItem clear = new JMenuItem("Clear"); + clear.addActionListener(e -> clear()); + menu.add(clear); + + return menu; + } + private void append(String line, Class clazz) { Document d = messages.getDocument(); if (d.getLength() > MAX_SIZE) @@ -58,13 +122,15 @@ public class MessagesView { } } + /** + * Sets different font style depending on message source + *

+ * this is ugly as hell, but that's so much better then nothing... + */ private AttributeSet getStyle(Class clazz) { - /** - * this is ugly as hell, but that's so much better then nothing... - */ - if (clazz == CommandQueue.class) + if (clazz == CommandQueue.COMMAND_QUEUE_CLASS) return bold; - if (clazz == PortHolder.class) + if (clazz == EngineState.ENGINE_STATE_CLASS) return italic; return null; } @@ -82,4 +148,12 @@ public class MessagesView { Document d = messages.getDocument(); clearMessages(d); } + + public void setPaused(boolean isPaused) { + this.isPaused = isPaused; + } + + public boolean isPaused() { + return isPaused; + } } \ No newline at end of file