// Path: se/sics/mspsim/core/StateChangeListener.java
// public interface StateChangeListener {
// 
//     public void stateChanged(Object source, int oldState, int newState);
// 
//     public static class Proxy extends ProxySupport<StateChangeListener> implements StateChangeListener {
//         public static final Proxy INSTANCE = new Proxy();
// 
//         @Override
//         public void stateChanged(Object source, int oldState, int newState) {
//             StateChangeListener[] listeners = this.listeners;
//             for(StateChangeListener listener : listeners) {
//                 listener.stateChanged(source, oldState, newState);
//             }
//         }
// 
//     }
// }
// 
// Path: se/sics/mspsim/platform/AbstractNodeGUI.java
// public abstract class AbstractNodeGUI extends JComponent implements ServiceComponent {
// 
//     private static final long serialVersionUID = 1435276301923987019L;
// 
//     private final String windowName;
//     private final String nodeImageName;
// 
//     private String name;
//     private ComponentRegistry registry;
// 
//     private ImageIcon nodeImage;
//     private ManagedWindow window;
// 
//     private ServiceComponent.Status status = Status.STOPPED;
// 
// 
//     protected AbstractNodeGUI(String windowName, String imageName) {
//         this.windowName = windowName;
//         this.nodeImageName = imageName;
//         setBackground(Color.black);
//         setOpaque(true);
//     }
// 
//     public Status getStatus() {
//         return status;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     protected ImageIcon getNodeImage() {
//         return nodeImage;
//     }
// 
//     protected ComponentRegistry getRegistry() {
//         return registry;
//     }
// 
//     public final void init(String name, ComponentRegistry registry) {
//         this.name = name;
//         this.registry = registry;
//     }
// 
//     public final void start() {
//         File fp = new File(nodeImageName);
//         if (!fp.canRead()) {
//             URL imageURL = getImageURL(nodeImageName);
//             if (imageURL == null
//                     && !nodeImageName.startsWith("images/")
//                     && !nodeImageName.startsWith("/images/")) {
//                 imageURL = getImageURL("images/" + nodeImageName);
//             }
//             if (imageURL != null) {
//                 nodeImage = new ImageIcon(imageURL);
//             } else {
//                 throw new IllegalStateException("image not found: " + nodeImageName);
//             }
//         } else {
//             nodeImage = new ImageIcon(nodeImageName);
//         }
//         if (nodeImage.getIconWidth() == 0 || nodeImage.getIconHeight() == 0) {
//           // Image not found
//           throw new IllegalStateException("image not found: " + nodeImageName);
//         }
//         setPreferredSize(new Dimension(nodeImage.getIconWidth(),
//                                        nodeImage.getIconHeight()));
// 
//         WindowManager wm = registry.getComponent(WindowManager.class);
//         window = wm.createWindow(windowName);
//         window.add(this);
//         window.pack();
// 
//         startGUI();
// 
//         status = Status.STARTED;
//         window.setVisible(true);
//     }
// 
//     private URL getImageURL(String image) {
//         URL imageURL = getClass().getResource(image);
//         if (imageURL == null && !image.startsWith("/")) {
//             imageURL = getClass().getResource("/" + image);
//         }
//         return imageURL;
//     }
// 
//     public final void stop() {
//         status = Status.STOPPED;
//         stopGUI();
//         if (window != null) {
//             window.setVisible(false);
//             window = null;
//         }
//     }
// 
//     protected abstract void startGUI();
// 
//     protected abstract void stopGUI();
// 
//     protected void paintComponent(Graphics g) {
//         Color old = g.getColor();
//         g.setColor(getBackground());
//         g.fillRect(0, 0, getWidth(), getHeight());
// 
//         ImageIcon nodeImage = getNodeImage();
//         nodeImage.paintIcon(this, g, 0, 0);
// 
//         g.setColor(old);
//     }
// }


import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import se.sics.mspsim.core.StateChangeListener;
import se.sics.mspsim.platform.AbstractNodeGUI;
import java.awt.Color;
    protected void paintComponent(Graphics g) {
        Color old = g.getColor();

        super.paintComponent(g);

        // Display all active leds
        if (node.redLed) {
            g.setColor(RED_TRANS);
            g.fillOval(LED_X - 2, RED_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(RED_C);
            g.fillOval(LED_X, RED_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (node.greenLed) {
            g.setColor(GREEN_TRANS);
            g.fillOval(LED_X - 2, GREEN_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(GREEN_C);
            g.fillOval(LED_X, GREEN_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (node.blueLed) {
            g.setColor(BLUE_TRANS);
            g.fillOval(LED_X - 2, BLUE_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(BLUE_C);
            g.fillOval(LED_X, BLUE_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (buttonDown) {
            g.setColor(BUTTON_C);
            g.fillOval(55, 234, 9, 9);
        }
        if (resetDown) {
            g.setColor(BUTTON_C);
// Path: se/sics/mspsim/core/StateChangeListener.java
// public interface StateChangeListener {
// 
//     public void stateChanged(Object source, int oldState, int newState);
// 
//     public static class Proxy extends ProxySupport<StateChangeListener> implements StateChangeListener {
//         public static final Proxy INSTANCE = new Proxy();
// 
//         @Override
//         public void stateChanged(Object source, int oldState, int newState) {
//             StateChangeListener[] listeners = this.listeners;
//             for(StateChangeListener listener : listeners) {
//                 listener.stateChanged(source, oldState, newState);
//             }
//         }
// 
//     }
// }
// 
// Path: se/sics/mspsim/platform/AbstractNodeGUI.java
// public abstract class AbstractNodeGUI extends JComponent implements ServiceComponent {
// 
//     private static final long serialVersionUID = 1435276301923987019L;
// 
//     private final String windowName;
//     private final String nodeImageName;
// 
//     private String name;
//     private ComponentRegistry registry;
// 
//     private ImageIcon nodeImage;
//     private ManagedWindow window;
// 
//     private ServiceComponent.Status status = Status.STOPPED;
// 
// 
//     protected AbstractNodeGUI(String windowName, String imageName) {
//         this.windowName = windowName;
//         this.nodeImageName = imageName;
//         setBackground(Color.black);
//         setOpaque(true);
//     }
// 
//     public Status getStatus() {
//         return status;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     protected ImageIcon getNodeImage() {
//         return nodeImage;
//     }
// 
//     protected ComponentRegistry getRegistry() {
//         return registry;
//     }
// 
//     public final void init(String name, ComponentRegistry registry) {
//         this.name = name;
//         this.registry = registry;
//     }
// 
//     public final void start() {
//         File fp = new File(nodeImageName);
//         if (!fp.canRead()) {
//             URL imageURL = getImageURL(nodeImageName);
//             if (imageURL == null
//                     && !nodeImageName.startsWith("images/")
//                     && !nodeImageName.startsWith("/images/")) {
//                 imageURL = getImageURL("images/" + nodeImageName);
//             }
//             if (imageURL != null) {
//                 nodeImage = new ImageIcon(imageURL);
//             } else {
//                 throw new IllegalStateException("image not found: " + nodeImageName);
//             }
//         } else {
//             nodeImage = new ImageIcon(nodeImageName);
//         }
//         if (nodeImage.getIconWidth() == 0 || nodeImage.getIconHeight() == 0) {
//           // Image not found
//           throw new IllegalStateException("image not found: " + nodeImageName);
//         }
//         setPreferredSize(new Dimension(nodeImage.getIconWidth(),
//                                        nodeImage.getIconHeight()));
// 
//         WindowManager wm = registry.getComponent(WindowManager.class);
//         window = wm.createWindow(windowName);
//         window.add(this);
//         window.pack();
// 
//         startGUI();
// 
//         status = Status.STARTED;
//         window.setVisible(true);
//     }
// 
//     private URL getImageURL(String image) {
//         URL imageURL = getClass().getResource(image);
//         if (imageURL == null && !image.startsWith("/")) {
//             imageURL = getClass().getResource("/" + image);
//         }
//         return imageURL;
//     }
// 
//     public final void stop() {
//         status = Status.STOPPED;
//         stopGUI();
//         if (window != null) {
//             window.setVisible(false);
//             window = null;
//         }
//     }
// 
//     protected abstract void startGUI();
// 
//     protected abstract void stopGUI();
// 
//     protected void paintComponent(Graphics g) {
//         Color old = g.getColor();
//         g.setColor(getBackground());
//         g.fillRect(0, 0, getWidth(), getHeight());
// 
//         ImageIcon nodeImage = getNodeImage();
//         nodeImage.paintIcon(this, g, 0, 0);
// 
//         g.setColor(old);
//     }
// }


// Path: se/sics/mspsim/platform/z1/Z1Gui.java
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import se.sics.mspsim.core.StateChangeListener;
import se.sics.mspsim.platform.AbstractNodeGUI;
import java.awt.Color;

    protected void paintComponent(Graphics g) {
        Color old = g.getColor();

        super.paintComponent(g);

        // Display all active leds
        if (node.redLed) {
            g.setColor(RED_TRANS);
            g.fillOval(LED_X - 2, RED_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(RED_C);
            g.fillOval(LED_X, RED_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (node.greenLed) {
            g.setColor(GREEN_TRANS);
            g.fillOval(LED_X - 2, GREEN_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(GREEN_C);
            g.fillOval(LED_X, GREEN_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (node.blueLed) {
            g.setColor(BLUE_TRANS);
            g.fillOval(LED_X - 2, BLUE_Y - 1, LED_WIDTH, LED_HEIGHT);
            g.setColor(BLUE_C);
            g.fillOval(LED_X, BLUE_Y, LED_WIDTH - 5, LED_HEIGHT - 2);
        }
        if (buttonDown) {
            g.setColor(BUTTON_C);
            g.fillOval(55, 234, 9, 9);
        }
        if (resetDown) {
            g.setColor(BUTTON_C);
            g.fillOval(55, 262, 9, 9);