瀏覽代碼

Adds TreePanel -> RightClick Expand/Show/ShowRecursive

Andreas T. Meyer-Berg 6 年之前
父節點
當前提交
f8c6a5eb1e

+ 58 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/control/NetworkTreeSettingsController.java

@@ -5,6 +5,7 @@ import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Model;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.configuration.NetworkTreeNodeStatus;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.configuration.NetworkTreeSettings;
 
 /**
@@ -59,6 +60,7 @@ public class NetworkTreeSettingsController {
 			/**
 			 * String node, is the top most -> Hide/Show the hole network
 			 */
+			getStatusOfObject(o).setExpanded(visible);
 			for(Link l:controller.getNetworkController().getLinks())
 				setVisibilityOfLink(l, visible);
 		}else if(o instanceof Link){
@@ -114,5 +116,61 @@ public class NetworkTreeSettingsController {
 			setVisibilityOfConnection(c,visible);
 		}
 	}
+	
+	/**
+	 * Returns the Status for the given Object
+	 * @param o Object, whose status should be returned
+	 * @return Status of the object
+	 */
+	public NetworkTreeNodeStatus getStatusOfObject(Object o){
+		return networkTreeSettings.getStatusOfObject(o);
+	}
+	
+	/**
+	 * Adds an status for the given Object
+	 * @param o Object to be added
+	 * @param status Status of the object
+	 */
+	public void addStatusOfObject(Object o, NetworkTreeNodeStatus status){
+		networkTreeSettings.addStatusOfObject(o, status);
+	}
+	
+	/**
+	 * Toggle the expanded status, expanded nodes will be collapsed and collapsed ones will be expanded
+	 * 
+	 * @param o Object to be expanded / collapsed
+	 */
+	public void toggleExpanded(Object o){
+		setExpanded(o, !networkTreeSettings.getStatusOfObject(o).isExpanded());
+		controller.notifyObservers();
+	}
+	/**
+	 * Set the expanded status of the object o to the value of isExpanded
+	 * @param o Object to be expanded / collapsed
+	 * @param isExpanded whether it should be expanded or collapsed
+	 */
+	public void setExpanded(Object o, boolean isExpanded){
+		networkTreeSettings.getStatusOfObject(o).setExpanded(isExpanded);
+		controller.notifyObservers();
+	}
+	
+	/**
+	 * Toggle visibility of an object
+	 * @param o object to be shown/hidden
+	 */
+	public void toggleVisibilityNonRecursive(Object o){
+		setVisibilityNonRecursive(o, !getStatusOfObject(o).isVisible());
+		controller.notifyObservers();
+	}
+
+	/**
+	 * Set Visibility of the object
+	 * @param o object to be shown/hidden
+	 * @param b
+	 */
+	private void setVisibilityNonRecursive(Object o, boolean b) {
+		getStatusOfObject(o).setVisible(b);
+		controller.notifyObservers();
+	}
 
 }

+ 91 - 4
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/popups/NetworkTreePanel.java

@@ -26,12 +26,12 @@ 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.control.NetworkTreeSettingsController;
 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;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.configuration.NetworkTreeNodeStatus;
-import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.configuration.NetworkTreeSettings;
 
 /**
  * Network Tree Panel which visualizes the Network as a Tree
@@ -64,9 +64,10 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 	 */
 	private NetworkTreePanel that;
 	/**
-	 * NetworkTreeSettings
+	 * NetworkTreeSettings Controller
 	 */
-	private NetworkTreeSettings networkTreeSettings;
+	private NetworkTreeSettingsController networkTreeSettings;
+	
 	/**
 	 * Network Controller
 	 */
@@ -89,6 +90,18 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 	 * MenuItem for deletion of devices
 	 */
 	private JMenuItem mntmDelete = new JMenuItem("Delete");
+	/**
+	 * MenuItem for expanding/collapsing nodes
+	 */
+	private JMenuItem mntmExpand = new JMenuItem("Expand");
+	/**
+	 * MenuItem for changing visibility of objects
+	 */
+	private JMenuItem mntmShow = new JMenuItem("Show");
+	/**
+	 * MenuItem for changing visibility of an object and all its  descendants
+	 */
+	private JMenuItem mntmShowRecursive = new JMenuItem("Show recursive");
 	
 	/**
 	 * Clicked object (Device, Link or Connection)
@@ -113,7 +126,7 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 		this.parent = parent;
 		this.controller = controller;
 		network = this.controller.getNetworkController();
-		networkTreeSettings = controller.getSettingsController().getConfigurationManager().getNetworkTreeSettings();
+		networkTreeSettings = controller.getSettingsController().getNetworkTreeSettingsController();
 		tree = new JTree();
 		initializeRightClickMenu();
 
@@ -145,6 +158,7 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 				TreePath clicked = tree.getPathForLocation(e.getX(), e.getY());
 				if(clicked==null||clicked.getPath() == null || clicked.getLastPathComponent() == null)
 					return;
+				clickedObject = ((DefaultMutableTreeNode)clicked.getLastPathComponent()).getUserObject();
 				//Expand/Collapse
 				/*
 				if(SwingUtilities.isLeftMouseButton(e)&&e.getClickCount()==2&&clicked!=null&&clicked.getLastPathComponent()!=null){
@@ -346,6 +360,27 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 	 */
 	private void initializeRightClickMenu() {
 		rightClick = new JPopupMenu();
+		
+		mntmExpand.addActionListener(a->{
+			if(clickedObject==null)return;
+				networkTreeSettings.toggleExpanded(clickedObject);
+		});
+		
+		rightClick.add(mntmExpand);
+		
+		mntmShow.addActionListener(a -> {
+			if(clickedObject==null)return;
+			networkTreeSettings.toggleVisibilityNonRecursive(clickedObject);
+		});
+		rightClick.add(mntmShow);
+		
+
+		mntmShowRecursive.addActionListener(a -> {
+			if(clickedObject==null)return;
+			networkTreeSettings.toggleVisibilityOf(clickedObject);
+		});
+		rightClick.add(mntmShowRecursive);
+		
 		mntmEdit.addActionListener(a->{
 			if(clickedObject == null)return;
 			if(clickedObject instanceof SmartDevice){
@@ -396,27 +431,79 @@ public class NetworkTreePanel extends JScrollPane implements Observer {
 			rightClick.setEnabled(false);
 		}else{
 			clickedObject = ((DefaultMutableTreeNode)clicked.getLastPathComponent()).getUserObject();
+			NetworkTreeNodeStatus status = networkTreeSettings.getStatusOfObject(clickedObject);
 			if(clickedObject instanceof SmartDevice){
 				//TODO: Specific actions
 				mntmEdit.setText("Edit Device");
 				mntmEdit.setEnabled(true);
 				mntmDelete.setText("Delete Device");
 				mntmDelete.setEnabled(true);
+				
+				mntmExpand.setText("Expand");
+				mntmExpand.setEnabled(false);
+				if(status.isVisible()){
+					mntmShow.setText("Hide");
+					mntmShowRecursive.setText("Hide recursive");					
+				}else{
+					mntmShow.setText("Show");
+					mntmShowRecursive.setText("Show recursive");
+				}
+				mntmShow.setEnabled(true);
+				mntmShowRecursive.setEnabled(false);
 			} else if(clickedObject instanceof Connection){
 				mntmEdit.setText("Edit Connection");
 				mntmEdit.setEnabled(true);
 				mntmDelete.setText("Delete Connection");
 				mntmDelete.setEnabled(true);
+				
+				if(status.isExpanded()){
+					mntmExpand.setText("Collapse");
+				}else{
+					mntmExpand.setText("Expand");
+				}
+				mntmExpand.setEnabled(true);
+				if(status.isVisible()){
+					mntmShowRecursive.setText("Hide recursive");					
+					mntmShow.setText("Hide");
+				}else{
+					mntmShowRecursive.setText("Show recursive");
+					mntmShow.setText("Show");
+				}
+				mntmShowRecursive.setEnabled(true);
+				mntmShow.setEnabled(true);
 			}else if(clickedObject instanceof Link){
 				mntmEdit.setText("Edit Link");
 				mntmEdit.setEnabled(true);
 				mntmDelete.setText("Delete Link");
 				mntmDelete.setEnabled(true);
+
+				if(status.isExpanded()){
+					mntmExpand.setText("Collapse");
+				}else{
+					mntmExpand.setText("Expand");
+				}
+				mntmExpand.setEnabled(true);
+				if(status.isVisible()){
+					mntmShow.setText("Hide");
+					mntmShowRecursive.setText("Hide recursive");					
+				}else{
+					mntmShow.setText("Show");
+					mntmShowRecursive.setText("Show recursive");
+				}
+				mntmShow.setEnabled(true);
+				mntmShowRecursive.setEnabled(true);
 			}else{
 				mntmEdit.setText("Edit");
 				mntmEdit.setEnabled(false);
 				mntmDelete.setText("Delete");
 				mntmDelete.setEnabled(false);
+
+				mntmExpand.setText("Expand");
+				mntmExpand.setEnabled(false);
+				mntmShow.setText("Show");
+				mntmShow.setEnabled(false);
+				mntmShowRecursive.setText("Show recursive");
+				mntmShowRecursive.setEnabled(false);
 			}
 			
 			rightClick.show(this,e.getX(), e.getY());