Outliner.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package holeg.ui.view.window;
  2. import holeg.model.AbstractCanvasObject;
  3. import holeg.model.GroupNode;
  4. import holeg.model.Holon;
  5. import holeg.model.HolonObject;
  6. import holeg.preferences.ColorPreference;
  7. import holeg.preferences.ImagePreference;
  8. import holeg.ui.controller.Control;
  9. import holeg.ui.view.image.Import;
  10. import holeg.utility.listener.WindowClosingListener;
  11. import holeg.utility.math.decimal.Format;
  12. import java.awt.BorderLayout;
  13. import java.awt.Color;
  14. import java.util.logging.Logger;
  15. import java.util.stream.Stream;
  16. import javax.swing.ImageIcon;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19. import javax.swing.JScrollPane;
  20. import javax.swing.JTabbedPane;
  21. import javax.swing.JTree;
  22. import javax.swing.tree.DefaultMutableTreeNode;
  23. import javax.swing.tree.DefaultTreeCellRenderer;
  24. public class Outliner extends JFrame {
  25. private static final Logger log = Logger.getLogger(Outliner.class.getName());
  26. private static final String ConsumptionFontHTMLBracket = "<font bgcolor='#"
  27. + Integer.toHexString(ColorPreference.Energy.Consumption.getRGB()).substring(2) + "'>";
  28. private static final String ProductionFontHTMLBracket = "<font bgcolor='#"
  29. + Integer.toHexString(ColorPreference.Energy.Production.getRGB()).substring(2) + "'>";
  30. private static final String FontClosingBracket = "</font> ";
  31. private static final String ProducerNodeText = getColoredHtmlText(
  32. ColorPreference.HolonObject.Producer, "Producer");
  33. private static final String OverSuppliedNodeText = getColoredHtmlText(
  34. ColorPreference.HolonObject.OverSupplied, "Over supplied");
  35. private static final String SuppliedNodeText = getColoredHtmlText(
  36. ColorPreference.HolonObject.Supplied, "Supplied");
  37. private static final String PartiallySuppliedNodeText = getColoredHtmlText(
  38. ColorPreference.HolonObject.PartiallySupplied, "Partially supplied");
  39. private static final String NotSuppliedNodeText = getColoredHtmlText(
  40. ColorPreference.HolonObject.NotSupplied, "Not supplied");
  41. private static final String NoEnergyNodeText = getColoredHtmlText(
  42. ColorPreference.HolonObject.NoEnergy, "No energy");
  43. private final Control control;
  44. JTabbedPane tabbedPane = new JTabbedPane();
  45. JPanel hierarchyPanel = new JPanel(new BorderLayout());
  46. JPanel holonPanel = new JPanel(new BorderLayout());
  47. Runnable update = this::update;
  48. public Outliner(JFrame parentFrame, Control control) {
  49. setBounds(0, 0, 400, parentFrame.getHeight());
  50. this.setIconImage(Import.loadImage(ImagePreference.Logo, 30, 30));
  51. this.setTitle("Outliner");
  52. setLocationRelativeTo(parentFrame);
  53. this.setVisible(true);
  54. this.control = control;
  55. update();
  56. this.getContentPane().add(tabbedPane);
  57. this.addWindowListener(
  58. (WindowClosingListener) e -> control.OnCanvasUpdate.removeListener(update));
  59. control.OnCanvasUpdate.addListener(update);
  60. tabbedPane.addTab("Hierarchy", hierarchyPanel);
  61. tabbedPane.addTab("Holons", holonPanel);
  62. }
  63. private static String getColoredHtmlText(Color color, String text) {
  64. return "<html><font bgcolor='#"
  65. + Integer.toHexString(color.getRGB()).substring(2) + "'>" +
  66. text + FontClosingBracket;
  67. }
  68. public void update() {
  69. hierarchyPanel.removeAll();
  70. holonPanel.removeAll();
  71. DefaultMutableTreeNode topListPanel = new DefaultMutableTreeNode();
  72. DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects");
  73. DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches");
  74. DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes");
  75. DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable");
  76. topListPanel.add(objects);
  77. topListPanel.add(switches);
  78. topListPanel.add(nodes);
  79. topListPanel.add(cables);
  80. DefaultMutableTreeNode topHolonNode = createHolonNode();
  81. DefaultMutableTreeNode topHierarchyNode = createHierarchyNode();
  82. JTree hierarchyTree = new JTree(topHierarchyNode);
  83. signIconsForTree(hierarchyTree);
  84. hierarchyTree.setRootVisible(false);
  85. for (int i = 0; i < hierarchyTree.getRowCount(); i++) {
  86. hierarchyTree.expandRow(i);
  87. }
  88. hierarchyPanel.add(new JScrollPane(hierarchyTree));
  89. JTree holonTree = new JTree(topHolonNode);
  90. signIconsForTree(holonTree);
  91. holonTree.setRootVisible(false);
  92. for (int i = 0; i < holonTree.getRowCount(); i++) {
  93. holonTree.expandRow(i);
  94. }
  95. holonPanel.add(new JScrollPane(holonTree));
  96. holonPanel.revalidate();
  97. hierarchyPanel.repaint();
  98. }
  99. private DefaultMutableTreeNode createHolonNode() {
  100. DefaultMutableTreeNode topHolonNode = new DefaultMutableTreeNode();
  101. for (Holon holon : control.getModel().holons) {
  102. DefaultMutableTreeNode holonNode = new DefaultMutableTreeNode("Holon");
  103. DefaultMutableTreeNode producer = new DefaultMutableTreeNode(ProducerNodeText);
  104. DefaultMutableTreeNode overSupplied = new DefaultMutableTreeNode(OverSuppliedNodeText);
  105. DefaultMutableTreeNode supplied = new DefaultMutableTreeNode(SuppliedNodeText);
  106. DefaultMutableTreeNode partiallySupplied = new DefaultMutableTreeNode(
  107. PartiallySuppliedNodeText);
  108. DefaultMutableTreeNode notSupplied = new DefaultMutableTreeNode(NotSuppliedNodeText);
  109. DefaultMutableTreeNode noEnergy = new DefaultMutableTreeNode(NoEnergyNodeText);
  110. for (HolonObject hObject : holon.holonObjects) {
  111. DefaultMutableTreeNode holonObjectNode = createColoredTreeNodeFromHolonObject(hObject);
  112. switch (hObject.getState()) {
  113. case PRODUCER -> producer.add(holonObjectNode);
  114. case OVER_SUPPLIED -> overSupplied.add(holonObjectNode);
  115. case SUPPLIED -> supplied.add(holonObjectNode);
  116. case PARTIALLY_SUPPLIED -> partiallySupplied.add(holonObjectNode);
  117. case NOT_SUPPLIED -> notSupplied.add(holonObjectNode);
  118. case NO_ENERGY -> noEnergy.add(holonObjectNode);
  119. }
  120. }
  121. Stream.of(producer, overSupplied, supplied, partiallySupplied, notSupplied, noEnergy)
  122. .filter(node -> !node.isLeaf()).forEach(holonNode::add);
  123. topHolonNode.add(holonNode);
  124. }
  125. return topHolonNode;
  126. }
  127. private DefaultMutableTreeNode createHierarchyNode() {
  128. DefaultMutableTreeNode hierarchyNode = new DefaultMutableTreeNode();
  129. hierarchyNode.add(getNodeFromGroupNode(control.getModel().getCanvas()));
  130. DefaultMutableTreeNode edgeNode = new DefaultMutableTreeNode("Edges");
  131. control.getModel().getEdgesOnCanvas().forEach(edge -> {
  132. edgeNode.add(new DefaultMutableTreeNode(edge.toString()));
  133. });
  134. hierarchyNode.add(edgeNode);
  135. return hierarchyNode;
  136. }
  137. private DefaultMutableTreeNode getNodeFromGroupNode(GroupNode groupNode) {
  138. DefaultMutableTreeNode node = new DefaultMutableTreeNode(groupNode.getName());
  139. groupNode.getHolonObjects().forEach(obj -> node.add(canvasObjectToNode(obj)));
  140. groupNode.getSwitches().forEach(obj -> node.add(canvasObjectToNode(obj)));
  141. groupNode.getNodes().forEach(obj -> node.add(canvasObjectToNode(obj)));
  142. groupNode.getGroupNodes().forEach(obj -> node.add(getNodeFromGroupNode(obj)));
  143. return node;
  144. }
  145. private DefaultMutableTreeNode canvasObjectToNode(AbstractCanvasObject obj) {
  146. return new DefaultMutableTreeNode(obj.getName() + " [" + obj.getId() + "]");
  147. }
  148. private void signIconsForTree(JTree t) {
  149. ImageIcon ClosedIcon = new ImageIcon(
  150. Import.loadImage(ImagePreference.Button.Outliner.Closed, 9, 9));
  151. ImageIcon OpenIcon = new ImageIcon(
  152. Import.loadImage(ImagePreference.Button.Outliner.Open, 9, 9));
  153. ImageIcon LeafIcon = new ImageIcon(
  154. Import.loadImage(ImagePreference.Button.Outliner.Leaf, 9, 9));
  155. DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
  156. renderer.setClosedIcon(ClosedIcon);
  157. renderer.setOpenIcon(OpenIcon);
  158. renderer.setLeafIcon(LeafIcon);
  159. t.setCellRenderer(renderer);
  160. }
  161. private DefaultMutableTreeNode createColoredTreeNodeFromHolonObject(HolonObject obj) {
  162. float energy = obj.getActualEnergy();
  163. String context = "<html>" + obj.getName() + "&nbsp;&nbsp;&nbsp;&nbsp;"
  164. + (obj.isConsumer() ? ConsumptionFontHTMLBracket : ProductionFontHTMLBracket)
  165. + Format.doubleTwoPlaces(energy) + FontClosingBracket
  166. + "</html>";
  167. return new DefaultMutableTreeNode(context);
  168. }
  169. }