Outliner.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package holeg.ui.view.window;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.util.ArrayList;
  5. import java.util.logging.Logger;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9. import javax.swing.JScrollPane;
  10. import javax.swing.JTabbedPane;
  11. import javax.swing.JTree;
  12. import javax.swing.event.TreeModelEvent;
  13. import javax.swing.event.TreeModelListener;
  14. import javax.swing.tree.DefaultMutableTreeNode;
  15. import javax.swing.tree.DefaultTreeCellRenderer;
  16. import holeg.model.AbstractCanvasObject;
  17. import holeg.model.Edge;
  18. import holeg.preferences.ColorPreference;
  19. import holeg.preferences.ImagePreference;
  20. import holeg.ui.controller.Control;
  21. import holeg.ui.model.Consumer;
  22. import holeg.ui.model.DecoratedNetwork;
  23. import holeg.ui.model.DecoratedState;
  24. import holeg.ui.model.DecoratedSwitch;
  25. import holeg.ui.model.MinimumNetwork;
  26. import holeg.ui.model.Model;
  27. import holeg.ui.model.Passiv;
  28. import holeg.ui.model.Supplier;
  29. import holeg.utility.image.Import;
  30. import holeg.utility.listener.WindowClosingListener;
  31. public class Outliner extends JFrame {
  32. private static final Logger log = Logger.getLogger(Outliner.class.getName());
  33. Control control;
  34. JTabbedPane tabbedPane = new JTabbedPane();
  35. JPanel listPanel = new JPanel(new BorderLayout());
  36. JPanel statePanel = new JPanel(new BorderLayout());
  37. ArrayList<MinimumNetwork> list;
  38. Runnable update = this::update;
  39. public Outliner(JFrame parentFrame, Model model, Control control){
  40. setBounds(0, 0, 400, parentFrame.getHeight());
  41. this.setIconImage(Import.loadImage(ImagePreference.Logo, 30, 30));
  42. this.setTitle("Outliner");
  43. setLocationRelativeTo(parentFrame);
  44. this.setVisible(true);
  45. this.control = control;
  46. update();
  47. this.getContentPane().add(tabbedPane);
  48. this.addWindowListener((WindowClosingListener) e -> {
  49. control.OnCanvasUpdate.removeListener(update);
  50. });
  51. control.OnCanvasUpdate.addListener(update);
  52. tabbedPane.addTab("List", listPanel);
  53. tabbedPane.addTab("State", statePanel);
  54. }
  55. public void update() {
  56. control.getSimManager().getActualDecorState().ifPresent(this::repaintWithDecoratedState);
  57. }
  58. public void repaintWithDecoratedState(DecoratedState decoratedState) {
  59. //tabbedPane.removeAll();
  60. listPanel.removeAll();
  61. statePanel.removeAll();
  62. DefaultMutableTreeNode topListPanel = new DefaultMutableTreeNode();
  63. DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects");
  64. DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches");
  65. DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes");
  66. DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable");
  67. topListPanel.add(objects);
  68. topListPanel.add(switches);
  69. topListPanel.add(nodes);
  70. topListPanel.add(cables);
  71. DefaultMutableTreeNode topStatePanel = new DefaultMutableTreeNode();
  72. for(DecoratedSwitch dSwitch: decoratedState.getDecoratedSwitches()) {
  73. switches.add(new DefaultMutableTreeNode(dSwitch.getModel().getName()));
  74. }
  75. /*for(CpsNode node: decoratedState.getNodeList()) {
  76. nodes.add(new DefaultMutableTreeNode(node.getName()));
  77. }*/
  78. for(DecoratedNetwork dNet: decoratedState.getNetworkList()) {
  79. DefaultMutableTreeNode network = new DefaultMutableTreeNode("Network");
  80. if(!dNet.getConsumerList().isEmpty() || !dNet.getConsumerSelfSuppliedList().isEmpty()) {
  81. DefaultMutableTreeNode consumer = new DefaultMutableTreeNode("ConsumerList");
  82. for (Consumer con : dNet.getConsumerList()) {
  83. DefaultMutableTreeNode consumerNode = new ColoredTreeNode(con.toString(),con.getState().toString(), ColorPreference.HolonObject.getStateColor(con.getState()) );
  84. consumer.add(consumerNode);
  85. objects.add(new DefaultMutableTreeNode(con.getModel().getName()));
  86. }
  87. for (Consumer con : dNet.getConsumerSelfSuppliedList()) {
  88. DefaultMutableTreeNode consumerNode = new DefaultMutableTreeNode(con.toString() + con.getState());
  89. consumer.add(consumerNode);
  90. objects.add(new DefaultMutableTreeNode(con.getModel().getName()));
  91. }
  92. network.add(consumer);
  93. }
  94. if(!dNet.getSupplierList().isEmpty()) {
  95. DefaultMutableTreeNode supplier = new DefaultMutableTreeNode("SupplierList");
  96. for (Supplier sup : dNet.getSupplierList()) {
  97. supplier.add(new DefaultMutableTreeNode(sup.toString()));
  98. objects.add(new DefaultMutableTreeNode(sup.getModel().getName()));
  99. }
  100. network.add(supplier);
  101. }
  102. for(Passiv pas: dNet.getPassivNoEnergyList()) {
  103. objects.add(new DefaultMutableTreeNode(pas.getModel().getName()));
  104. }
  105. topStatePanel.add(network);
  106. for(Edge cable : dNet.getDecoratedCableList()) {
  107. cables.add(new DefaultMutableTreeNode(cable.toString()));
  108. }
  109. }
  110. for(Edge cable : decoratedState.getLeftOverEdges()) {
  111. cables.add(new DefaultMutableTreeNode(cable.toString()));
  112. }
  113. JTree listTree = new JTree(topListPanel);
  114. signIconsForTree(listTree);
  115. listTree.setRootVisible(false);
  116. for (int i = 0; i < listTree.getRowCount(); i++) {
  117. listTree.expandRow(i);
  118. }
  119. JScrollPane listScroller = new JScrollPane(listTree);
  120. listPanel.add(listScroller);
  121. JTree stateTree = new JTree(topStatePanel);
  122. signIconsForTree(stateTree);
  123. stateTree.setRootVisible(false);
  124. for (int i = 0; i < stateTree.getRowCount(); i++) {
  125. stateTree.expandRow(i);
  126. }
  127. statePanel.add(new JScrollPane(stateTree));
  128. listPanel.revalidate();;
  129. statePanel.revalidate();
  130. listPanel.repaint();
  131. }
  132. private void signIconsForTree(JTree t) {
  133. ImageIcon ClosedIcon = new ImageIcon(Import.loadImage("/images/buttons/close.png",9,9));
  134. ImageIcon OpenIcon = new ImageIcon(Import.loadImage("/images/buttons/open.png",9,9));
  135. ImageIcon LeafIcon = new ImageIcon(Import.loadImage("/images/buttons/leaf.png",9,9));
  136. if (ClosedIcon != null && OpenIcon != null && LeafIcon!= null) {
  137. DefaultTreeCellRenderer renderer =
  138. new DefaultTreeCellRenderer();
  139. renderer.setClosedIcon(ClosedIcon);
  140. renderer.setOpenIcon(OpenIcon);
  141. renderer.setLeafIcon(LeafIcon);
  142. t.setCellRenderer(renderer);
  143. }
  144. }
  145. class MyTreeModelListener implements TreeModelListener {
  146. @Override
  147. public void treeNodesChanged(TreeModelEvent tmE) {
  148. log.info("treeNodesChanged");
  149. }
  150. @Override
  151. public void treeNodesInserted(TreeModelEvent tmE) {
  152. log.info("treeNodesInserted");
  153. }
  154. @Override
  155. public void treeNodesRemoved(TreeModelEvent tmE) {
  156. log.info("treeNodesRemoved");
  157. }
  158. @Override
  159. public void treeStructureChanged(TreeModelEvent tmE) {
  160. log.info("treeStructureChanged");
  161. }
  162. }
  163. class ColoredTreeNode extends DefaultMutableTreeNode{
  164. private Color color;
  165. public ColoredTreeNode(String string, String state, Color color) {
  166. //"<html>Some text <font color='red'>" + "bla" + "some text in red</font></html>"
  167. //Integer.toHexString(color.getRGB()).substring(2)
  168. //String c = string + "<html><font bgcolor='#132122'>" + state +"</font></html>";
  169. super(( "<html>" + string + "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + state +"</font></html>"));
  170. //this.color = color;
  171. }
  172. public Color getColor(){
  173. return color;
  174. }
  175. public void setColor(Color color) {
  176. this.color = color;
  177. }
  178. }
  179. class AbstractCpsObjectInfo {
  180. private AbstractCanvasObject aCps;
  181. AbstractCpsObjectInfo(AbstractCanvasObject aCps){
  182. this.aCps = aCps;
  183. }
  184. @Override
  185. public String toString(){
  186. return aCps.getName() + " Id:"+ aCps.getId();
  187. }
  188. public AbstractCanvasObject getAbstractCpsObject()
  189. {
  190. return aCps;
  191. }
  192. }
  193. }