added menu options: copy to clipboard and save to file

This commit is contained in:
fros4943 2009-06-15 10:53:24 +00:00
parent 3c7d0329ef
commit 4a4630d9ec

View file

@ -26,24 +26,37 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: RadioLogger.java,v 1.21 2009/06/12 14:34:29 nifi Exp $ * $Id: RadioLogger.java,v 1.22 2009/06/15 10:53:24 fros4943 Exp $
*/ */
package se.sics.cooja.plugins; package se.sics.cooja.plugins;
import java.awt.Font; import java.awt.Font;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Observable; import java.util.Observable;
import java.util.Observer; import java.util.Observer;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import org.apache.log4j.Logger;
import org.jdom.Element; import org.jdom.Element;
import se.sics.cooja.ClassDescription; import se.sics.cooja.ClassDescription;
import se.sics.cooja.ConvertedRadioPacket; import se.sics.cooja.ConvertedRadioPacket;
@ -69,7 +82,7 @@ import se.sics.cooja.util.StringUtils;
@ClassDescription("Radio Logger") @ClassDescription("Radio Logger")
@PluginType(PluginType.SIM_PLUGIN) @PluginType(PluginType.SIM_PLUGIN)
public class RadioLogger extends VisPlugin { public class RadioLogger extends VisPlugin {
private static Logger logger = Logger.getLogger(RadioLogger.class);
private static final long serialVersionUID = -6927091711697081353L; private static final long serialVersionUID = -6927091711697081353L;
private final static int COLUMN_TIME = 0; private final static int COLUMN_TIME = 0;
@ -89,13 +102,14 @@ public class RadioLogger extends VisPlugin {
private ArrayList<RadioConnectionLog> connections = new ArrayList<RadioConnectionLog>(); private ArrayList<RadioConnectionLog> connections = new ArrayList<RadioConnectionLog>();
private RadioMedium radioMedium; private RadioMedium radioMedium;
private Observer radioMediumObserver; private Observer radioMediumObserver;
private AbstractTableModel model;
public RadioLogger(final Simulation simulationToControl, final GUI gui) { public RadioLogger(final Simulation simulationToControl, final GUI gui) {
super("Radio Logger", gui); super("Radio Logger", gui);
simulation = simulationToControl; simulation = simulationToControl;
radioMedium = simulation.getRadioMedium(); radioMedium = simulation.getRadioMedium();
final AbstractTableModel model = new AbstractTableModel() { model = new AbstractTableModel() {
private static final long serialVersionUID = 1692207305977527004L; private static final long serialVersionUID = 1692207305977527004L;
@ -219,20 +233,11 @@ public class RadioLogger extends VisPlugin {
dataTable.setFont(new Font("Monospaced", Font.PLAIN, 12)); dataTable.setFont(new Font("Monospaced", Font.PLAIN, 12));
JPopupMenu popupMenu = new JPopupMenu(); JPopupMenu popupMenu = new JPopupMenu();
JMenuItem clearItem = new JMenuItem("Clear"); popupMenu.add(new JMenuItem(copyAction));
clearItem.addActionListener(new ActionListener() { popupMenu.add(new JMenuItem(copyAllAction));
popupMenu.add(new JMenuItem(clearAction));
public void actionPerformed(ActionEvent e) { popupMenu.addSeparator();
int size = connections.size(); popupMenu.add(new JMenuItem(saveAction));
if (size > 0) {
connections.clear();
model.fireTableRowsDeleted(0, size - 1);
setTitle("Radio Logger: " + dataTable.getRowCount() + " packets");
}
}
});
popupMenu.add(clearItem);
dataTable.setComponentPopupMenu(popupMenu); dataTable.setComponentPopupMenu(popupMenu);
add(new JScrollPane(dataTable)); add(new JScrollPane(dataTable));
@ -373,4 +378,113 @@ public class RadioLogger extends VisPlugin {
String data = null; String data = null;
String tooltip = null; String tooltip = null;
} }
private String getDestString(RadioConnectionLog c) {
Radio[] dests = c.connection.getDestinations();
if (dests.length == 0) {
return "-";
}
if (dests.length == 1) {
return getMoteID(dests[0].getMote());
}
StringBuilder sb = new StringBuilder();
for (Radio dest: dests) {
sb.append(getMoteID(dest.getMote()) + ',');
}
sb.setLength(sb.length()-1);
return sb.toString();
}
private Action clearAction = new AbstractAction("Clear") {
public void actionPerformed(ActionEvent e) {
int size = connections.size();
if (size > 0) {
connections.clear();
model.fireTableRowsDeleted(0, size - 1);
setTitle("Radio Logger: " + dataTable.getRowCount() + " packets");
}
}
};
private Action copyAction = new AbstractAction("Copy selected") {
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
int[] selectedRows = dataTable.getSelectedRows();
StringBuilder sb = new StringBuilder();
for (int i: selectedRows) {
sb.append("" + dataTable.getValueAt(i, COLUMN_TIME) + '\t');
sb.append("" + dataTable.getValueAt(i, COLUMN_FROM) + '\t');
sb.append("" + getDestString(connections.get(i)) + '\t');
sb.append("" + dataTable.getValueAt(i, COLUMN_DATA) + '\n');
}
StringSelection stringSelection = new StringSelection(sb.toString());
clipboard.setContents(stringSelection, null);
}
};
private Action copyAllAction = new AbstractAction("Copy all") {
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringBuilder sb = new StringBuilder();
for(int i=0; i < connections.size(); i++) {
sb.append("" + dataTable.getValueAt(i, COLUMN_TIME) + '\t');
sb.append("" + dataTable.getValueAt(i, COLUMN_FROM) + '\t');
sb.append("" + getDestString(connections.get(i)) + '\t');
sb.append("" + dataTable.getValueAt(i, COLUMN_DATA) + '\n');
}
StringSelection stringSelection = new StringSelection(sb.toString());
clipboard.setContents(stringSelection, null);
}
};
private Action saveAction = new AbstractAction("Save to file") {
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
int returnVal = fc.showSaveDialog(GUI.getTopParentContainer());
if (returnVal != JFileChooser.APPROVE_OPTION) {
return;
}
File saveFile = fc.getSelectedFile();
if (saveFile.exists()) {
String s1 = "Overwrite";
String s2 = "Cancel";
Object[] options = { s1, s2 };
int n = JOptionPane.showOptionDialog(
GUI.getTopParentContainer(),
"A file with the same name already exists.\nDo you want to remove it?",
"Overwrite existing file?", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options, s1);
if (n != JOptionPane.YES_OPTION) {
return;
}
}
if (saveFile.exists() && !saveFile.canWrite()) {
logger.fatal("No write access to file: " + saveFile);
return;
}
try {
PrintWriter outStream = new PrintWriter(new FileWriter(saveFile));
for(int i=0; i < connections.size(); i++) {
outStream.print("" + dataTable.getValueAt(i, COLUMN_TIME) + '\t');
outStream.print("" + dataTable.getValueAt(i, COLUMN_FROM) + '\t');
outStream.print("" + getDestString(connections.get(i)) + '\t');
outStream.print("" + dataTable.getValueAt(i, COLUMN_DATA) + '\n');
}
outStream.close();
} catch (Exception ex) {
logger.fatal("Could not write to file: " + saveFile);
return;
}
}
};
} }