Ver Fonte

Improves NetworkPanel, Adds NetworkTreeCellRenderer

* Click & Selection Listener
-> just prints at the moment
* Model contains the Objects instead of Strings
* TreeCellRenderer to display Links, Connections & Devices
-> Color for "hidden" Devices etc. - no hiding model yet
Andreas T. Meyer-Berg há 5 anos atrás
pai
commit
283e959912

+ 3 - 1
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/SmartDevice.java

@@ -92,7 +92,8 @@ public class SmartDevice {
 	 *            the link to add
 	 */
 	public void addLink(Link link) {
-		this.links.add(link);
+		if(!links.contains(link) && link != null)
+			links.add(link);
 	}
 
 	/**
@@ -216,6 +217,7 @@ public class SmartDevice {
 	 * @param port the port to add
 	 */
 	public void addPort(Port port) {
+		if(!ports.contains(port)&&port!=null)
 		this.ports.add(port);
 	}
 	

+ 86 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/popups/NetworkTreeCellRenderer.java

@@ -0,0 +1,86 @@
+package de.tu_darmstadt.tk.SmartHomeNetworkSim.view.popups;
+
+import java.awt.Component;
+import java.util.Random;
+
+import javax.swing.JLabel;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreeCellRenderer;
+
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
+
+/**
+ * TreeCellRenderer for the Network tree, which visualizes the different network parts
+ *
+ * @author Andreas T. Meyer-Berg
+ */
+public class NetworkTreeCellRenderer implements TreeCellRenderer {
+	/**
+	 * Label which describes the node
+	 */
+	private JLabel label;
+	/**
+	 * Controller to manipulate / get infos from the model
+	 */
+	private Controller controller;
+	/**
+	 * Creates a new NetworkTreeCellRenderer
+	 */
+	public NetworkTreeCellRenderer(Controller controller) {
+		label = new JLabel();
+		this.controller = controller;
+	}
+	@Override
+	public Component getTreeCellRendererComponent(JTree tree, Object value,
+			boolean selected, boolean expanded, boolean leaf, int row,
+			boolean hasFocus) {
+		/**
+		 * TODO: TreeSelection Settings
+		 * e.g. HashMap Link -> Link Settings (visible, color etc.)
+		 */
+		controller.getSettingsController();
+		/**
+		 * Object which should be rendered
+		 */
+		Object o = ((DefaultMutableTreeNode) value).getUserObject();
+		if (o instanceof SmartDevice) {
+			/**
+			 * Device to be rendered
+			 */
+			SmartDevice device = (SmartDevice) o;
+			boolean hidden = new Random().nextBoolean();
+			//label.setIcon(new ImageIcon(Utility.loadFile("/images/smartHome_icon.png").getScaledInstance(12, 12, 0)));
+
+			label.setText("<html><font color=\""+(hidden?"grey":"black")+"\">"+device.getName()+"</font></html>");
+		} else if (o instanceof Connection){
+			/**
+			 * Connection to be rendered
+			 */
+			Connection connection = (Connection) o;
+			//label.setIcon(new ImageIcon(Utility.loadFile("/images/smartHome_icon.png").getScaledInstance(12, 12, 0)));
+			
+			label.setText(connection.getName());				
+		}else if(o instanceof Link){
+			/**
+			 * Link to be rendered
+			 */
+			Link link = (Link) o;
+			//label.setIcon(new ImageIcon(Utility.loadFile("/images/smartHome_icon.png").getScaledInstance(12, 12, 0)));
+			
+			label.setText(link.getName());
+			
+		}
+		else {
+			/**
+			 * Default use toString
+			 */
+			label.setIcon(null);
+			label.setText("" + value);
+		}
+		return label;
+	}
+}

+ 138 - 19
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/popups/NetworkTreePanel.java

@@ -1,19 +1,36 @@
 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.JScrollPane;
 import javax.swing.JTree;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.DefaultTreeModel;
 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.NetworkController;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
 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
 	 */
 	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) {
+		that = this;
 		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");
-			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);
+
 				}
 				link.add(connection);
 			}
 			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);
 		tree.setModel(model);
-		this.setViewportView(tree);
-		this.setPreferredSize(this.parent.getSize());
-	}
+		/**
+		 * Repaint
+		 */
+		tree.repaint();
 
+	}
 }