package com.roboclub.robobuggy.ros.tools;
/**
* @author Matt Sebek
*
* @version 0.5
*
* CHANGELOG: NONE
*
* DESCRIPTION: Disaply for seeing the contents of messages as they are broadcasted
*/
import java.awt.BorderLayout; //for layout managers and more
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //for action events
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
//import com.roboclub.robobuggy.messages.EncoderMeasurement;
import com.roboclub.robobuggy.ros.Message;
import com.roboclub.robobuggy.ros.MessageListener;
import com.roboclub.robobuggy.ros.Subscriber;
public class MessageListenerGui extends JPanel implements ActionListener {
private static final long serialVersionUID = -3528970717084422491L;
private JTextField filterTextField = new JTextField(256);
private DefaultTableModel model;
private class myWorker extends SwingWorker<Object, String> {
@Override
protected Object doInBackground() throws Exception {
System.out.println("do in background fired!");
Subscriber s = new Subscriber("messageListenerGui", "/sensor/encoder",
new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
System.out.println("IT RAN I AM SO HAPPY");
}
});
while (true) {
// TODO fix this.
Thread.sleep(100);
}
}
}
public MessageListenerGui(List<String> topic_to_listen_on) {
setLayout(new BorderLayout());
// Set up topic-add text box
JLabel textFieldLabel = new JLabel("Filter:");
textFieldLabel.setLabelFor(filterTextField);
filterTextField.addActionListener(this);
// Lay out the text controls and the labels.
JPanel controlPane = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
controlPane.setLayout(gridbag);
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.WEST;
c.weightx = 1.0;
controlPane.add(filterTextField, c);
controlPane.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createTitledBorder("Type a prefix then press enter"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
// Set up table to display messages in the bottom pane
model = new DefaultTableModel();
model.addColumn("Time");
model.addColumn("Message");
JTable table = new JTable(model);
JScrollPane tableScroll = new JScrollPane(table);
tableScroll
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
tableScroll.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createCompoundBorder(
BorderFactory.createTitledBorder("Plain Text"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)),
tableScroll.getBorder()));
// Put everything together.
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(controlPane, BorderLayout.PAGE_START);
mainPanel.add(tableScroll, BorderLayout.CENTER);
add(mainPanel, BorderLayout.LINE_START);
}
// Listen on filterTextField to have enter hit
@Override
public void actionPerformed(ActionEvent e) {
String input = filterTextField.getText();
System.out.println("Adding topic..." + input);
SwingWorker<Object, String> temp = new myWorker();
temp.execute();
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event dispatch thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Message Monitor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add content to the window.
frame.add(new MessageListenerGui(new ArrayList<String>()));
// Display the window.
frame.pack();
frame.setVisible(true);
}
public void startGui() {
System.out.println("code was run!");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Turn off metal's use of bold fonts
System.out.println("runlater was run!");
createAndShowGUI();
}
});
}
public static void open_message_window(List<String> topics_to_listen_on) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Turn off metal's use of bold fonts
UIManager.put("swing.boldMetal", Boolean.FALSE);
JFrame frame = new JFrame("ROS Message Monitor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MessageListenerGui(topics_to_listen_on));
// Display the window.
frame.pack();
frame.setVisible(true);
}
});
}
public static void main(String[] args) {
// Start the GUI
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Turn off metal's use of bold fonts
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
// Start a publisher!
// TODO: restore this (and correct the dependencies) to actually run this tool.
/*Publisher p = new Publisher("/sensor/encoder");
while (true) {
p.publish(new EncoderMeasurement(41, 42));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
}
}