From 8782094b2f6799862c4708623ba9b41b47621729 Mon Sep 17 00:00:00 2001 From: fros4943 Date: Tue, 12 Oct 2010 10:27:26 +0000 Subject: [PATCH] minor updated: more zoom levels, implemented mote highlighting, updated channel-specific colors, added move to top mote action --- .../java/se/sics/cooja/plugins/TimeLine.java | 146 ++++++++++++------ 1 file changed, 102 insertions(+), 44 deletions(-) diff --git a/tools/cooja/java/se/sics/cooja/plugins/TimeLine.java b/tools/cooja/java/se/sics/cooja/plugins/TimeLine.java index c2f16325f..8916a5567 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/TimeLine.java +++ b/tools/cooja/java/se/sics/cooja/plugins/TimeLine.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: TimeLine.java,v 1.28 2010/08/17 15:04:56 fros4943 Exp $ + * $Id: TimeLine.java,v 1.29 2010/10/12 10:27:26 fros4943 Exp $ */ package se.sics.cooja.plugins; @@ -118,7 +118,10 @@ public class TimeLine extends VisPlugin { private double currentPixelDivisor = 200; - private static final long[] ZOOM_LEVELS = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000 }; + private static final long[] ZOOM_LEVELS = { + 1, 2, 5, 10, + 20, 50, 100, 200, 500, 1000, + 2000, 5000, 10000, 20000, 50000, 100000 }; private boolean needZoomOut = false; @@ -135,6 +138,10 @@ public class TimeLine extends VisPlugin { private Box eventCheckboxes; private JSplitPane splitPane; + private Observer moteHighlightObserver = null; + private ArrayList highlightedMotes = new ArrayList(); + private final static Color HIGHLIGHT_COLOR = Color.CYAN; + private ArrayList activeMoteObservers = new ArrayList(); private ArrayList allMoteEvents = new ArrayList(); @@ -277,7 +284,37 @@ public class TimeLine extends VisPlugin { /* Update timeline for the duration of the plugin */ repaintTimelineTimer.start(); - /* TODO Register Integer overflow time event */ + gui.addMoteHighlightObserver(moteHighlightObserver = new Observer() { + public void update(Observable obs, Object obj) { + if (!(obj instanceof Mote)) { + return; + } + + final Timer timer = new Timer(100, null); + final Mote mote = (Mote) obj; + timer.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + /* Count down */ + if (timer.getDelay() < 90) { + timer.stop(); + highlightedMotes.remove(mote); + repaint(); + return; + } + + /* Toggle highlight state */ + if (highlightedMotes.contains(mote)) { + highlightedMotes.remove(mote); + } else { + highlightedMotes.add(mote); + } + timer.setDelay(timer.getDelay()-1); + repaint(); + } + }); + timer.start(); + } + }); } private JCheckBox createEventCheckbox(String text, String tooltip) { @@ -298,16 +335,16 @@ public class TimeLine extends VisPlugin { private static final long serialVersionUID = 621116674700872058L; public void actionPerformed(ActionEvent e) { JComponent b = (JComponent) e.getSource(); - Mote MOTE = (Mote) b.getClientProperty("mote"); + Mote m = (Mote) b.getClientProperty("mote"); /* Sort by distance */ ArrayList sortedMoteEvents = new ArrayList(); for (MoteEvents me: allMoteEvents.toArray(new MoteEvents[0])) { - double d = me.mote.getInterfaces().getPosition().getDistanceTo(MOTE); + double d = me.mote.getInterfaces().getPosition().getDistanceTo(m); int i=0; for (i=0; i < sortedMoteEvents.size(); i++) { - double d2 = MOTE.getInterfaces().getPosition().getDistanceTo(sortedMoteEvents.get(i).mote); + double d2 = m.getInterfaces().getPosition().getDistanceTo(sortedMoteEvents.get(i).mote); if (d < d2) { break; } @@ -319,6 +356,25 @@ public class TimeLine extends VisPlugin { numberMotesWasUpdated(); } }; + private Action topMoteAction = new AbstractAction() { + private static final long serialVersionUID = 4683178751482241843L; + public void actionPerformed(ActionEvent e) { + JComponent b = (JComponent) e.getSource(); + Mote m = (Mote) b.getClientProperty("mote"); + + /* Sort by distance */ + MoteEvents mEvent = null; + for (MoteEvents me: allMoteEvents.toArray(new MoteEvents[0])) { + if (me.mote == m) { + mEvent = me; + break; + } + } + allMoteEvents.remove(mEvent); + allMoteEvents.add(0, mEvent); + numberMotesWasUpdated(); + } + }; private Action addMoteAction = new AbstractAction("Add motes to timeline") { private static final long serialVersionUID = 7546685285707302865L; public void actionPerformed(ActionEvent e) { @@ -1121,6 +1177,10 @@ public class TimeLine extends VisPlugin { /* Remove repaint timer */ repaintTimelineTimer.stop(); + if (moteHighlightObserver != null) { + simulation.getGUI().deleteMoteHighlightObserver(moteHighlightObserver); + } + simulation.getEventCentral().removeMoteCountListener(newMotesListener); /* Remove active mote interface observers */ @@ -1721,12 +1781,15 @@ public class TimeLine extends VisPlugin { setBackground(COLOR_BACKGROUND); final JPopupMenu popupMenu = new JPopupMenu(); + final JMenuItem topItem = new JMenuItem(topMoteAction); + topItem.setText("Move to top"); + popupMenu.add(topItem); + final JMenuItem sortItem = new JMenuItem(sortMoteAction); + sortItem.setText("Sort by distance"); + popupMenu.add(sortItem); final JMenuItem removeItem = new JMenuItem(removeMoteAction); removeItem.setText("Remove from timeline"); popupMenu.add(removeItem); - final JMenuItem sortItem = new JMenuItem(sortMoteAction); - removeItem.setText("Sort by distance"); - popupMenu.add(sortItem); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { @@ -1734,10 +1797,14 @@ public class TimeLine extends VisPlugin { if (m == null) { return; } - removeItem.setText("Remove from timeline: " + m); - removeItem.putClientProperty("mote", m); + simulation.getGUI().signalMoteHighlight(m); + sortItem.setText("Sort by distance: " + m); sortItem.putClientProperty("mote", m); + topItem.setText("Move to top: " + m); + topItem.putClientProperty("mote", m); + removeItem.setText("Remove from timeline: " + m); + removeItem.putClientProperty("mote", m); popupMenu.show(MoteRuler.this, e.getX(), e.getY()); } }); @@ -1765,7 +1832,11 @@ public class TimeLine extends VisPlugin { String str = "" + moteLog.mote.getID(); int w = g.getFontMetrics().stringWidth(str) + 1; - /*g.drawRect(0, y, getWidth()-1, paintedMoteHeight);*/ + if (highlightedMotes.contains(moteLog.mote)) { + g.setColor(HIGHLIGHT_COLOR); + g.fillRect(0, y-paintedMoteHeight, getWidth()-1, paintedMoteHeight); + g.setColor(Color.BLACK); + } g.drawString(str, getWidth() - w, y); y += paintedMoteHeight; } @@ -1900,37 +1971,20 @@ public class TimeLine extends VisPlugin { return Color.GRAY; /* TODO Implement me */ } } - private final Color[] CHANNEL_COLORS = new Color[] { - new Color(200, 200, 200), - new Color(200, 200, 255), - new Color(200, 255, 200), - new Color(200, 255, 255), - new Color(255, 200, 200), - new Color(255, 255, 200), - new Color(255, 255, 255), - new Color(255, 220, 200), - new Color(220, 255, 220), - new Color(255, 200, 255), - new Color(200, 200, 200), - new Color(200, 200, 255), - new Color(200, 255, 200), - new Color(200, 255, 255), - new Color(255, 200, 200), - new Color(255, 255, 200), - new Color(255, 255, 255), - new Color(255, 220, 200), - new Color(220, 255, 220), - new Color(255, 200, 255), - new Color(200, 200, 200), - new Color(200, 200, 255), - new Color(200, 255, 200), - new Color(200, 255, 255), - new Color(255, 200, 200), - new Color(255, 255, 200), - new Color(255, 255, 255), - new Color(255, 220, 200), - new Color(220, 255, 220), - new Color(255, 200, 255), + + /* TODO Which colors? */ + private final static Color[] CHANNEL_COLORS = new Color[] { + Color.decode("0x008080"), Color.decode("0x808080"), Color.decode("0xC00000"), + Color.decode("0x000020"), Color.decode("0x202000"), Color.decode("0x200020"), + Color.decode("0x002020"), Color.decode("0x202020"), Color.decode("0x006060"), + Color.decode("0x606060"), Color.decode("0xA00000"), Color.decode("0x00A000"), + Color.decode("0x0000A0"), Color.decode("0x400040"), Color.decode("0x004040"), + Color.decode("0x404040"), Color.decode("0x200000"), Color.decode("0x002000"), + Color.decode("0xA0A000"), Color.decode("0xA000A0"), Color.decode("0x00A0A0"), + Color.decode("0xA0A0A0"), Color.decode("0xE00000"), Color.decode("0x600000"), + Color.decode("0x000040"), Color.decode("0x404000"), Color.decode("0xFF0000"), + Color.decode("0x00FF00"), Color.decode("0x0000FF"), Color.decode("0xFFFF00"), + Color.decode("0xFF00FF"), Color.decode("0x808000"), Color.decode("0x800080"), }; class RadioHWEvent extends MoteEvent { boolean on; @@ -1950,7 +2004,11 @@ public class TimeLine extends VisPlugin { return on?Color.GRAY:null; } public String toString() { - return "Radio HW was turned " + (on?"on":"off") + " at time " + time + "
"; + String str = "Radio HW was turned " + (on?"on":"off") + " at time " + time + "
"; + if (channel > 0) { + str += "Radio channel: " + channel; + } + return str; } } class LEDEvent extends MoteEvent {