rusefi/java_console/ui/src/main/java/com/rusefi/ui/MessagesView.java

128 lines
3.9 KiB
Java

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.core.preferences.storage.Node;
import com.rusefi.ui.util.UiUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.text.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MessagesView {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(FileLog.DATE_PATTERN);
private final Style bold;
private final Style italic;
private final Node config;
private boolean isPaused;
protected final JTextPane messages = new JTextPane();
public final JScrollPane messagesScroll = new JScrollPane(messages, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
public MessagesView(Node config) {
this.config = config;
messages.setEditable(false);
UiUtils.installPopupMenu(createPopupMenu(), messages);
StyledDocument d = (StyledDocument) messages.getDocument();
bold = d.addStyle("StyleName", null);
bold.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
italic = d.addStyle("StyleName", null);
italic.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
MessagesCentral.getInstance().addListener(new MessagesCentral.MessageListener() {
@Override
public void onMessage(Class clazz, String message) {
final String date = DATE_FORMAT.format(new Date());
if (!isPaused)
append(date + ": " + clazz.getSimpleName() + ": " + message, clazz);
}
});
}
@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?
*/
menu.add(UiUtils.createCopyMenu(messages));
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();
int logSizeControl = LogSizeControl.getValue(config);
if (d.getLength() > logSizeControl)
clearMessages(d, logSizeControl);
try {
d.insertString(d.getLength(), line + "\r\n", getStyle(clazz));
messages.select(d.getLength(), d.getLength());
} catch (BadLocationException e) {
throw new IllegalStateException(e);
}
}
/**
* Sets different font style depending on message source
* <p>
* this is ugly as hell, but that's so much better then nothing...
*/
private AttributeSet getStyle(Class clazz) {
if (clazz == CommandQueue.COMMAND_QUEUE_CLASS)
return bold;
if (clazz == EngineState.ENGINE_STATE_CLASS)
return italic;
return null;
}
private void clearMessages(Document d, int logSizeControl) {
try {
d.remove(0, d.getLength() - logSizeControl / 2);
} catch (BadLocationException e) {
throw new IllegalStateException(e);
}
}
public void clear() {
Document d = messages.getDocument();
clearMessages(d, 0);
}
public void setPaused(boolean isPaused) {
this.isPaused = isPaused;
}
public boolean isPaused() {
return isPaused;
}
}