package holeg.ui.view.window; import java.awt.BorderLayout; import java.awt.Color; import java.util.Set; import java.util.logging.Logger; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTree; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import holeg.model.AbstractCanvasObject; import holeg.preferences.ImagePreference; import holeg.ui.controller.Control; import holeg.model.Holon; import holeg.model.Model; import holeg.ui.view.image.Import; import holeg.utility.listener.WindowClosingListener; public class Outliner extends JFrame { private static final Logger log = Logger.getLogger(Outliner.class.getName()); Control control; JTabbedPane tabbedPane = new JTabbedPane(); JPanel listPanel = new JPanel(new BorderLayout()); JPanel statePanel = new JPanel(new BorderLayout()); Set list; Runnable update = this::update; public Outliner(JFrame parentFrame, Control control) { setBounds(0, 0, 400, parentFrame.getHeight()); this.setIconImage(Import.loadImage(ImagePreference.Logo, 30, 30)); this.setTitle("Outliner"); setLocationRelativeTo(parentFrame); this.setVisible(true); this.control = control; update(); this.getContentPane().add(tabbedPane); this.addWindowListener((WindowClosingListener) e -> { control.OnCanvasUpdate.removeListener(update); }); control.OnCanvasUpdate.addListener(update); tabbedPane.addTab("List", listPanel); tabbedPane.addTab("State", statePanel); } public void update() { // tabbedPane.removeAll(); listPanel.removeAll(); statePanel.removeAll(); DefaultMutableTreeNode topListPanel = new DefaultMutableTreeNode(); DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects"); DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches"); DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes"); DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable"); topListPanel.add(objects); topListPanel.add(switches); topListPanel.add(nodes); topListPanel.add(cables); DefaultMutableTreeNode topStatePanel = new DefaultMutableTreeNode(); Model model = control.getModel(); model.getCanvas().getAllSwitchObjectsRecursive().forEach(hS -> { switches.add(new DefaultMutableTreeNode(hS.getName())); }); //TODO(Tom2022-01-13): Fix Outliner // for (DecoratedNetwork dNet : decoratedState.getNetworkList()) { // DefaultMutableTreeNode network = new DefaultMutableTreeNode("Network"); // if (!dNet.getConsumerList().isEmpty() || !dNet.getConsumerSelfSuppliedList().isEmpty()) { // DefaultMutableTreeNode consumer = new DefaultMutableTreeNode("ConsumerList"); // for (Consumer con : dNet.getConsumerList()) { // DefaultMutableTreeNode consumerNode = new ColoredTreeNode(con.toString(), con.getState().toString(), // ColorPreference.HolonObject.getStateColor(con.getState())); // consumer.add(consumerNode); // objects.add(new DefaultMutableTreeNode(con.getModel().getName())); // } // for (Consumer con : dNet.getConsumerSelfSuppliedList()) { // DefaultMutableTreeNode consumerNode = new DefaultMutableTreeNode(con.toString() + con.getState()); // consumer.add(consumerNode); // objects.add(new DefaultMutableTreeNode(con.getModel().getName())); // } // network.add(consumer); // } // if (!dNet.getSupplierList().isEmpty()) { // DefaultMutableTreeNode supplier = new DefaultMutableTreeNode("SupplierList"); // for (Supplier sup : dNet.getSupplierList()) { // supplier.add(new DefaultMutableTreeNode(sup.toString())); // objects.add(new DefaultMutableTreeNode(sup.getModel().getName())); // } // network.add(supplier); // } // for (Passiv pas : dNet.getPassivNoEnergyList()) { // objects.add(new DefaultMutableTreeNode(pas.getModel().getName())); // } // topStatePanel.add(network); // for (Edge cable : dNet.getDecoratedCableList()) { // cables.add(new DefaultMutableTreeNode(cable.toString())); // } // } // // for (Edge cable : decoratedState.getLeftOverEdges()) { // cables.add(new DefaultMutableTreeNode(cable.toString())); // } JTree listTree = new JTree(topListPanel); signIconsForTree(listTree); listTree.setRootVisible(false); for (int i = 0; i < listTree.getRowCount(); i++) { listTree.expandRow(i); } JScrollPane listScroller = new JScrollPane(listTree); listPanel.add(listScroller); JTree stateTree = new JTree(topStatePanel); signIconsForTree(stateTree); stateTree.setRootVisible(false); for (int i = 0; i < stateTree.getRowCount(); i++) { stateTree.expandRow(i); } statePanel.add(new JScrollPane(stateTree)); listPanel.revalidate(); ; statePanel.revalidate(); listPanel.repaint(); } private void signIconsForTree(JTree t) { ImageIcon ClosedIcon = new ImageIcon(Import.loadImage(ImagePreference.Button.Outliner.Closed, 9, 9)); ImageIcon OpenIcon = new ImageIcon(Import.loadImage(ImagePreference.Button.Outliner.Open, 9, 9)); ImageIcon LeafIcon = new ImageIcon(Import.loadImage(ImagePreference.Button.Outliner.Leaf, 9, 9)); if (ClosedIcon != null && OpenIcon != null && LeafIcon != null) { DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); renderer.setClosedIcon(ClosedIcon); renderer.setOpenIcon(OpenIcon); renderer.setLeafIcon(LeafIcon); t.setCellRenderer(renderer); } } class MyTreeModelListener implements TreeModelListener { @Override public void treeNodesChanged(TreeModelEvent tmE) { log.info("treeNodesChanged"); } @Override public void treeNodesInserted(TreeModelEvent tmE) { log.info("treeNodesInserted"); } @Override public void treeNodesRemoved(TreeModelEvent tmE) { log.info("treeNodesRemoved"); } @Override public void treeStructureChanged(TreeModelEvent tmE) { log.info("treeStructureChanged"); } } class ColoredTreeNode extends DefaultMutableTreeNode { private Color color; public ColoredTreeNode(String string, String state, Color color) { // "Some text " + "bla" + "some text in // red" // Integer.toHexString(color.getRGB()).substring(2) // String c = string + "" + state // +""; super(("" + string + "" + state + "")); // this.color = color; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } } class AbstractCpsObjectInfo { private AbstractCanvasObject aCps; AbstractCpsObjectInfo(AbstractCanvasObject aCps) { this.aCps = aCps; } @Override public String toString() { return aCps.getName() + " Id:" + aCps.getId(); } public AbstractCanvasObject getAbstractCpsObject() { return aCps; } } }