Skip to content

Commit

Permalink
UI improvements - moved headers into separate tab, added search field…
Browse files Browse the repository at this point in the history
…, version bump up.
  • Loading branch information
mvmn committed Dec 7, 2021
1 parent eac4f87 commit f67e8a3
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 9 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>x.mvmn.kafkagui</groupId>
<artifactId>mvmn-kafkagui</artifactId>
<version>0.3.0</version>
<version>0.4.0</version>
<packaging>jar</packaging>

<properties>
Expand Down
58 changes: 52 additions & 6 deletions src/main/java/x/mvmn/kafkagui/gui/KafkaAdminGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,12 @@
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.DefaultCaret;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
Expand Down Expand Up @@ -153,8 +156,8 @@ public boolean isCellEditable(int row, int column) {
new DefaultComboBoxModel<>(Charset.availableCharsets().keySet().toArray(new String[0])));
protected final JCheckBox msgViewHex = new JCheckBox("Hex");
protected final JPanel pnlHeaders = new JPanel(new BorderLayout());
protected final JSplitPane msgContentHeadersSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(msgContent),
pnlHeaders);
// protected final JSplitPane msgContentHeadersSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(msgContent),
// pnlHeaders);

protected final JComboBox<String> msgGetOption = new JComboBox<>(new String[] { "Latest", "Earliest" });
protected final JTextField msgGetCount = SwingUtil.numericOnlyTextField(10L, 0L, null, false);
Expand Down Expand Up @@ -182,6 +185,9 @@ public boolean isCellEditable(int row, int column) {
protected volatile boolean receiveInProgress = false;
protected volatile boolean topicOrPartitionSelected = false;

protected final JTextField tfSearch = new JTextField();
protected final JCheckBox cbSearchCaseSensitive = new JCheckBox("Case-sensitive");

public KafkaAdminGui(String configName, Properties clientConfig, File appHomeFolder) {
super(configName + " - MVMn Kafka Client GUI");
this.clientConfig = clientConfig;
Expand Down Expand Up @@ -473,15 +479,30 @@ public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoExceptio
gbc.gridy = 2;
gbc.gridx = 0;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.gridwidth = 1;
msgPanel.add(new JLabel("Search"), gbc);
gbc.gridx = 1;
msgPanel.add(tfSearch, gbc);
gbc.gridx = 2;
msgPanel.add(cbSearchCaseSensitive, gbc);
gbc.gridy = 3;
gbc.gridx = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.BOTH;
msgContent.setEditable(false);
DefaultCaret caret = (DefaultCaret) msgContent.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
JTabbedPane tabPane = new JTabbedPane();
pnlHeaders.add(new JScrollPane(msgHeaders), BorderLayout.CENTER);
pnlHeaders.add(new JLabel("Message headers"), BorderLayout.NORTH);
// pnlHeaders.add(new JScrollPane(msgHeaders), BorderLayout.CENTER);
// pnlHeaders.add(new JLabel("Message headers"), BorderLayout.NORTH);

tabPane.addTab("Message content", msgContentHeadersSplitPane);
// tabPane.addTab("Message content", msgContentHeadersSplitPane);

tabPane.addTab("Message content", new JScrollPane(msgContent));
tabPane.addTab("Message headers", new JScrollPane(msgHeaders));
tabPane.addTab("Groovy processor", new JScrollPane(txaGroovyTransform));
msgPanel.add(tabPane, gbc);

Expand Down Expand Up @@ -800,6 +821,25 @@ public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoExceptio
});
});

tfSearch.getDocument().addDocumentListener(new DocumentListener() {

@Override
public void removeUpdate(DocumentEvent e) {
applySearch();
}

@Override
public void insertUpdate(DocumentEvent e) {
applySearch();
}

@Override
public void changedUpdate(DocumentEvent e) {
applySearch();
}
});
cbSearchCaseSensitive.addChangeListener(e -> applySearch());

onTopicsTreeSelectionChange();

KafkaAdminGui.this.setLayout(new BorderLayout());
Expand All @@ -809,12 +849,16 @@ public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoExceptio
KafkaAdminGui.this.pack();
SwingUtil.moveToScreenCenter(KafkaAdminGui.this);
msgSplitPane.setDividerLocation(0.3);
msgContentHeadersSplitPane.setDividerLocation(0.5);
// msgContentHeadersSplitPane.setDividerLocation(0.5);
KafkaAdminGui.this.setVisible(true);
});
});
}

private void applySearch() {
SwingUtil.applySearchHighlight(msgContent, tfSearch.getText(), cbSearchCaseSensitive.isSelected(), msgContent.getSelectionColor());
}

private List<Tuple<String, byte[], Void, Void, Void>> convertHeaders(Headers headers) {
return headers != null
? StreamSupport.stream(Spliterators.spliteratorUnknownSize(headers.iterator(), Spliterator.ORDERED), false)
Expand Down Expand Up @@ -857,6 +901,7 @@ protected void viewMsgContent(byte[] messageContent, List<Tuple<String, byte[],
msgContent.setFont(monospacedFont);
msgContent.setText(HexUtil.toHex(messageContent, " "));
headers.forEach(header -> headersTableModel.addRow(new String[] { header.getA(), HexUtil.toHex(header.getB(), " ") }));
applySearch();
} else {
msgContent.setFont(defaultFont);
msgContent.setLineWrap(false);
Expand All @@ -881,6 +926,7 @@ protected void viewMsgContent(byte[] messageContent, List<Tuple<String, byte[],
msgContent.setToolTipText(finalErrorText);
msgContent.setForeground(
finalErrorText != null ? Color.red : (Color) UIManager.getDefaults().get("TextArea.foreground"));
applySearch();
});
});
}
Expand Down
44 changes: 42 additions & 2 deletions src/main/java/x/mvmn/kafkagui/gui/util/SwingUtil.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package x.mvmn.kafkagui.gui.util;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
Expand All @@ -11,11 +12,15 @@

import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
import javax.swing.text.NumberFormatter;

import x.mvmn.kafkagui.lang.StackTraceUtil;
Expand Down Expand Up @@ -106,7 +111,9 @@ public static JTextField numericOnlyTextField(Long initialValue, Long min, Long

public static String getLookAndFeelName(LookAndFeel lnf) {
return Arrays.stream(UIManager.getInstalledLookAndFeels())
.filter(lnfInfo -> lnfInfo.getClassName().equals(lnf.getClass().getCanonicalName())).map(LookAndFeelInfo::getName).findAny()
.filter(lnfInfo -> lnfInfo.getClassName().equals(lnf.getClass().getCanonicalName()))
.map(LookAndFeelInfo::getName)
.findAny()
.orElse(null);
}

Expand All @@ -124,7 +131,9 @@ public static void updateComponentTreeUI(Window window) {
}

public static void setLookAndFeel(String lookAndFeelName) {
Arrays.stream(UIManager.getInstalledLookAndFeels()).filter(lnf -> lnf.getName().equals(lookAndFeelName)).findAny()
Arrays.stream(UIManager.getInstalledLookAndFeels())
.filter(lnf -> lnf.getName().equals(lookAndFeelName))
.findAny()
.ifPresent(lnf -> {
try {
if (!UIManager.getLookAndFeel().getName().equals(lnf.getName())) {
Expand All @@ -136,4 +145,35 @@ public static void setLookAndFeel(String lookAndFeelName) {
}
});
}

public static void applySearchHighlight(JTextArea txa, String searchText, boolean caseSensitive, Color highlightColor) {
txa.getHighlighter().removeAllHighlights();
if (searchText.length() > 0) {
String text = txa.getText();
if (!caseSensitive) {
text = text.toLowerCase();
searchText = searchText.toLowerCase();
}
DefaultHighlightPainter highlighter = new DefaultHighlighter.DefaultHighlightPainter(highlightColor);
boolean first = true;
int pos = text.indexOf(searchText);
while (pos >= 0) {
int endPos = pos + searchText.length();
try {
txa.getHighlighter().addHighlight(pos, endPos, highlighter);
} catch (BadLocationException e) {
// Ignore
}
if (first) {
first = false;
try {
txa.scrollRectToVisible(txa.modelToView(pos));
} catch (BadLocationException e) {
// Ignore
}
}
pos = text.indexOf(searchText, endPos);
}
}
}
}

0 comments on commit f67e8a3

Please sign in to comment.