|
@@ -1,19 +1,36 @@
|
|
package de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups;
|
|
package de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups;
|
|
|
|
|
|
|
|
+import java.awt.event.MouseAdapter;
|
|
|
|
+import java.awt.event.MouseEvent;
|
|
|
|
+import java.awt.event.WindowAdapter;
|
|
|
|
+import java.awt.event.WindowEvent;
|
|
|
|
+import java.util.Collection;
|
|
|
|
+import java.util.LinkedList;
|
|
|
|
+import java.util.Observable;
|
|
|
|
+import java.util.Observer;
|
|
|
|
+
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.JTree;
|
|
import javax.swing.JTree;
|
|
|
|
+import javax.swing.event.TreeSelectionEvent;
|
|
|
|
+import javax.swing.event.TreeSelectionListener;
|
|
import javax.swing.tree.DefaultTreeModel;
|
|
import javax.swing.tree.DefaultTreeModel;
|
|
import javax.swing.tree.DefaultMutableTreeNode;
|
|
import javax.swing.tree.DefaultMutableTreeNode;
|
|
|
|
+import javax.swing.tree.TreePath;
|
|
|
|
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.NetworkController;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.NetworkController;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
|
|
import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
|
|
|
|
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
|
|
|
|
|
|
-
|
|
|
|
-public class NetworkTreePanel extends JScrollPane {
|
|
|
|
|
|
+/**
|
|
|
|
+ * Network Tree Panel which visualizes the Network as a Tree
|
|
|
|
+ *
|
|
|
|
+ * @author Andreas T. Meyer-Berg
|
|
|
|
+ */
|
|
|
|
+public class NetworkTreePanel extends JScrollPane implements Observer {
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
@@ -23,33 +40,135 @@ public class NetworkTreePanel extends JScrollPane {
|
|
* Parent Frame
|
|
* Parent Frame
|
|
*/
|
|
*/
|
|
private JFrame parent;
|
|
private JFrame parent;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Root of the tree
|
|
|
|
+ */
|
|
|
|
+ private DefaultMutableTreeNode root;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * JTree, which visualizes the network
|
|
|
|
+ */
|
|
|
|
+ private JTree tree;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Reference to this for anonymous listener
|
|
|
|
+ */
|
|
|
|
+ private NetworkTreePanel that;
|
|
|
|
+ /**
|
|
|
|
+ * Network Controller
|
|
|
|
+ */
|
|
|
|
+ private NetworkController network;
|
|
|
|
+ /**
|
|
|
|
+ * Controller
|
|
|
|
+ */
|
|
|
|
+ private Controller controller;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Creates a new Netork Tree Panel
|
|
|
|
+ *
|
|
|
|
+ * @param c
|
|
|
|
+ * Controller
|
|
|
|
+ * @param parent
|
|
|
|
+ * parent frame
|
|
|
|
+ */
|
|
public NetworkTreePanel(Controller c, JFrame parent) {
|
|
public NetworkTreePanel(Controller c, JFrame parent) {
|
|
|
|
+ that = this;
|
|
this.parent = parent;
|
|
this.parent = parent;
|
|
- NetworkController network = c.getNetworkController();
|
|
|
|
- JTree tree = new JTree();
|
|
|
|
- //tree.setPreferredSize(parent.getSize());
|
|
|
|
- //tree.setMaximumSize(new Dimension(600, 1000));
|
|
|
|
- DefaultMutableTreeNode root = new DefaultMutableTreeNode("Network");
|
|
|
|
- for(Link l: network.getLinks()){
|
|
|
|
- if(l == null)
|
|
|
|
|
|
+ network = c.getNetworkController();
|
|
|
|
+ tree = new JTree();
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Custom Renderer
|
|
|
|
+ */
|
|
|
|
+ tree.setCellRenderer(new NetworkTreeCellRenderer(controller));
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Tree selection Listener
|
|
|
|
+ */
|
|
|
|
+ tree.addTreeSelectionListener(new TreeSelectionListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void valueChanged(TreeSelectionEvent e) {
|
|
|
|
+ System.out.println("Path selected" + e.getPath());
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Tree click listener
|
|
|
|
+ */
|
|
|
|
+ tree.addMouseListener(new MouseAdapter() {
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void mouseClicked(MouseEvent e) {
|
|
|
|
+ TreePath clicked = tree.getPathForLocation(e.getX(), e.getY());
|
|
|
|
+ System.out.println("Click on tree: " + clicked);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ this.setViewportView(tree);
|
|
|
|
+ this.setPreferredSize(this.parent.getSize());
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * MVC - Receive updates on model change, and remove listener on Frame
|
|
|
|
+ * close
|
|
|
|
+ */
|
|
|
|
+ c.addObserver(this);
|
|
|
|
+ parent.addWindowListener(new WindowAdapter() {
|
|
|
|
+ @Override
|
|
|
|
+ public void windowClosing(WindowEvent e) {
|
|
|
|
+ c.removeObserver(that);
|
|
|
|
+ super.windowClosing(e);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ update(null, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void update(Observable o, Object arg) {
|
|
|
|
+ root = new DefaultMutableTreeNode("Network");
|
|
|
|
+ for (Link l : network.getLinks()) {
|
|
|
|
+ if (l == null)
|
|
System.err.println("Warning: link = null in NetworkTreePanel");
|
|
System.err.println("Warning: link = null in NetworkTreePanel");
|
|
- DefaultMutableTreeNode link = new DefaultMutableTreeNode(l.getName());
|
|
|
|
- for(Connection con: network.getConnections()){
|
|
|
|
- if(!l.getConnections().contains(con))continue;
|
|
|
|
- DefaultMutableTreeNode connection = new DefaultMutableTreeNode(con.getName());
|
|
|
|
- for(Port p:con.getParticipants()){
|
|
|
|
- if(!l.getDevices().contains(p.getOwner())||!con.getParticipants().contains(p))continue;
|
|
|
|
- DefaultMutableTreeNode port = new DefaultMutableTreeNode(p.getOwner().getName());
|
|
|
|
|
|
+ DefaultMutableTreeNode link = new DefaultMutableTreeNode(l);
|
|
|
|
+ for (Connection con : network.getConnections()) {
|
|
|
|
+ if (!l.getConnections().contains(con))
|
|
|
|
+ continue;
|
|
|
|
+ DefaultMutableTreeNode connection = new DefaultMutableTreeNode(
|
|
|
|
+ con);
|
|
|
|
+ for (Port p : con.getParticipants()) {
|
|
|
|
+ if (!l.getDevices().contains(p.getOwner())
|
|
|
|
+ || !con.getParticipants().contains(p))
|
|
|
|
+ continue;
|
|
|
|
+ DefaultMutableTreeNode port = new DefaultMutableTreeNode(
|
|
|
|
+ p.getOwner());
|
|
connection.add(port);
|
|
connection.add(port);
|
|
|
|
+
|
|
}
|
|
}
|
|
link.add(connection);
|
|
link.add(connection);
|
|
}
|
|
}
|
|
root.add(link);
|
|
root.add(link);
|
|
}
|
|
}
|
|
|
|
+ /**
|
|
|
|
+ * Add devices without link to the network view
|
|
|
|
+ */
|
|
|
|
+ Collection<SmartDevice> noLinkDevices = new LinkedList<SmartDevice>(
|
|
|
|
+ network.getSmartDevices());
|
|
|
|
+ noLinkDevices.removeIf(d -> (d.getLinks().size() > 0));
|
|
|
|
+ if (noLinkDevices.size() > 0) {
|
|
|
|
+ DefaultMutableTreeNode noLink = new DefaultMutableTreeNode(
|
|
|
|
+ "No Link");
|
|
|
|
+ DefaultMutableTreeNode noCon = new DefaultMutableTreeNode(
|
|
|
|
+ "No Connection");
|
|
|
|
+ noLink.add(noCon);
|
|
|
|
+ for (SmartDevice d : noLinkDevices)
|
|
|
|
+ noCon.add(new DefaultMutableTreeNode(d));
|
|
|
|
+ root.add(noLink);
|
|
|
|
+ }
|
|
DefaultTreeModel model = new DefaultTreeModel(root);
|
|
DefaultTreeModel model = new DefaultTreeModel(root);
|
|
tree.setModel(model);
|
|
tree.setModel(model);
|
|
- this.setViewportView(tree);
|
|
|
|
- this.setPreferredSize(this.parent.getSize());
|
|
|
|
- }
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Repaint
|
|
|
|
+ */
|
|
|
|
+ tree.repaint();
|
|
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|