Outliner.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.util.ArrayList;
  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 javax.swing.tree.DefaultTreeModel;
  17. import classes.AbstractCpsObject;
  18. import classes.CpsEdge;
  19. import classes.HolonObject;
  20. import ui.controller.CalculataModel;
  21. import ui.controller.Control;
  22. import ui.controller.UpdateController;
  23. import ui.model.Consumer;
  24. import ui.model.Consumer.SupplierListEntry;
  25. import ui.model.DecoratedHolonObject;
  26. import ui.model.DecoratedHolonObject.HolonObjectState;
  27. import ui.model.DecoratedNetwork;
  28. import ui.model.MinimumModel;
  29. import ui.model.MinimumNetwork;
  30. import ui.model.Model;
  31. import ui.model.Supplier;
  32. public class Outliner extends JFrame {
  33. private static final long serialVersionUID = 1L;
  34. private JTree tree;
  35. DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects");
  36. DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable");
  37. DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches");
  38. DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes");
  39. ArrayList<MinimumNetwork> list;
  40. Outliner(JFrame parentFrame, Model model, Control controller, GUI gui){
  41. setBounds(0, 0, 400, parentFrame.getHeight());
  42. this.setIconImage(Util.loadImage("/Images/Holeg.png", 30, 30));
  43. this.setTitle("Outliner");
  44. setLocationRelativeTo(parentFrame);
  45. this.setVisible(true);
  46. JTabbedPane tabbedPane = new JTabbedPane();
  47. JPanel listPanel = createOutlinerListPanel(model, controller, gui);
  48. tabbedPane.addTab("List", listPanel);
  49. MinimumModel mm = new MinimumModel(model.getObjectsOnCanvas(), model.getEdgesOnCanvas());
  50. list = CalculataModel.calculateNetworks(mm, model.getCurIteration());
  51. JPanel networkPanel = createNetworkPanel();
  52. tabbedPane.addTab("Networks", networkPanel);
  53. ArrayList<DecoratedNetwork> computedList = new ArrayList<DecoratedNetwork>();
  54. for (MinimumNetwork net : list) {
  55. computedList.add(new DecoratedNetwork(net, model.getCurIteration()));
  56. }
  57. JPanel decoratedNetworkPanel = generateDecoratedNetworkPanel(computedList);
  58. tabbedPane.addTab("Computed Networks", decoratedNetworkPanel);
  59. this.getContentPane().add(tabbedPane);
  60. }
  61. private JPanel generateDecoratedNetworkPanel(ArrayList<DecoratedNetwork> computedList) {
  62. JPanel decoratedNetworkPanel = new JPanel(new BorderLayout());
  63. DefaultMutableTreeNode top = new DefaultMutableTreeNode();
  64. for (DecoratedNetwork dNet : computedList) {
  65. DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode("Network");
  66. DefaultMutableTreeNode consumerListNode = new DefaultMutableTreeNode("ConsumerList");
  67. DefaultMutableTreeNode supplierListNode = new DefaultMutableTreeNode("SupplierList");
  68. if (!dNet.getConsumerList().isEmpty() || !dNet.getConsumerSelfSuppliedList().isEmpty()) {
  69. for (Consumer con : dNet.getConsumerList()) {
  70. DefaultMutableTreeNode consumerNode = new ColoredTreeNode(con.toString(),con.getState().toString(), getStateColor(con.getState()) );
  71. for(Consumer.SupplierListEntry sup: con.getSupplierList())
  72. {
  73. consumerNode.add(new DefaultMutableTreeNode(sup.supplier.getModel().getName() + " Energy:" + sup.energyFromSupplier));
  74. }
  75. consumerListNode.add(consumerNode);
  76. }
  77. for (Consumer con : dNet.getConsumerSelfSuppliedList()) {
  78. DefaultMutableTreeNode consumerNode = new DefaultMutableTreeNode(con.toString() + con.getState());
  79. for(Consumer.SupplierListEntry sup: con.getSupplierList())
  80. {
  81. consumerNode.add(new DefaultMutableTreeNode(sup.supplier.getModel().getName() + " Energy:" + sup.energyFromSupplier));
  82. }
  83. consumerListNode.add(consumerNode);
  84. }
  85. networkNode.add(consumerListNode);
  86. }
  87. if (!dNet.getSupplierList().isEmpty()) {
  88. networkNode.add(supplierListNode);
  89. for (Supplier sup : dNet.getSupplierList()) {
  90. supplierListNode.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(sup.getModel())));
  91. }
  92. }
  93. top.add(networkNode);
  94. }
  95. JTree networkTree = new JTree(top);
  96. signIconsForTree(networkTree);
  97. networkTree.setRootVisible(false);
  98. for (int i = 0; i < networkTree.getRowCount(); i++) {
  99. networkTree.expandRow(i);
  100. }
  101. JScrollPane listScroller = new JScrollPane(networkTree);
  102. decoratedNetworkPanel.add(listScroller);
  103. return decoratedNetworkPanel;
  104. }
  105. private JPanel createNetworkPanel() {
  106. JPanel networkPanel = new JPanel(new BorderLayout());
  107. DefaultMutableTreeNode top = new DefaultMutableTreeNode();
  108. for (MinimumNetwork net : list) {
  109. DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode("Network");
  110. for (HolonObject hObject : net.getHolonObjectList()) {
  111. networkNode.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(hObject)));
  112. }
  113. top.add(networkNode);
  114. }
  115. JTree networkTree = new JTree(top);
  116. signIconsForTree(networkTree);
  117. networkTree.setRootVisible(false);
  118. for (int i = 0; i < networkTree.getRowCount(); i++) {
  119. networkTree.expandRow(i);
  120. }
  121. JScrollPane listScroller = new JScrollPane(networkTree);
  122. networkPanel.add(listScroller);
  123. return networkPanel;
  124. }
  125. private JPanel createOutlinerListPanel(Model model, Control controller, GUI gui) {
  126. JPanel contentPanel = new JPanel(new BorderLayout());
  127. DefaultMutableTreeNode top =new DefaultMutableTreeNode();
  128. DefaultTreeModel treeModel = new DefaultTreeModel(top);
  129. treeModel.addTreeModelListener(new MyTreeModelListener());
  130. createCategorys(top);
  131. popullateCategorys(model);
  132. tree = new JTree(treeModel);
  133. tree.setRootVisible(false);
  134. UpdateController updCon = new UpdateController(model, controller);
  135. tree.addTreeSelectionListener(tsl -> {
  136. if(tree.getSelectionPath() == null) return;
  137. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tsl.getPath().getLastPathComponent();
  138. System.out.println(tsl.getPath().getPathCount());
  139. if(tsl.getPath().getPathCount() == 3) // 2 is Category 3 is ObjectIn Category
  140. {
  141. if(selectedNode.getParent().equals(objects))
  142. {
  143. AbstractCpsObjectInfo info = (AbstractCpsObjectInfo)selectedNode.getUserObject();
  144. //treeModel.nodeChanged(selectedNode);
  145. model.getSelectedCpsObjects().clear();
  146. controller.addSelectedObject(info.getAbstractCpsObject());
  147. if(info.getAbstractCpsObject() instanceof HolonObject)
  148. {
  149. HolonObject hO = (HolonObject) info.getAbstractCpsObject();
  150. System.out.println("HolonObject" + hO);
  151. System.out.println("getEnergyAtTimestep:" + hO.getEnergyAtTimeStep(0));
  152. System.out.println("getEnergyNeededFromConsumingElements:" + hO.getEnergyNeededFromConsumingElements(0));
  153. System.out.println("getEnergySelfProducing:" + hO.getEnergySelfProducingFromProducingElements(0));
  154. System.out.println("getMinimumConsumingElement:" + hO.getMinimumConsumingElement(0));
  155. System.out.println("countConsumingElements:" + hO.countConsumingElements(0));
  156. System.out.println("countProducingElements:" + hO.countProducingElements(0));
  157. }
  158. DefaulTable propertyTable = model.getPropertyTable();
  159. if (propertyTable.getRowCount() > 0) {
  160. for (int i = propertyTable.getRowCount() - 1; i > -1; i--) {
  161. propertyTable.removeRow(i);
  162. }
  163. }
  164. updCon.paintProperties(info.getAbstractCpsObject());
  165. updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
  166. updCon.refreshTableProperties(model.getPropertyTable());
  167. gui.getFrmCyberPhysical().repaint();
  168. }
  169. else if(selectedNode.getParent().equals(cables))
  170. {
  171. EdgeInfo info = (EdgeInfo)selectedNode.getUserObject();
  172. model.setSelectedEdge(info.getEdge());
  173. DefaulTable propertyTable = model.getPropertyTable();
  174. if (propertyTable.getRowCount() > 0) {
  175. for (int i = propertyTable.getRowCount() - 1; i > -1; i--) {
  176. propertyTable.removeRow(i);
  177. }
  178. }
  179. controller.setSelecteEdge(info.getEdge());
  180. //controller.setSelectedObjectID(0);
  181. updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
  182. updCon.refreshTableProperties(model.getPropertyTable());
  183. gui.getFrmCyberPhysical().repaint();
  184. }
  185. }
  186. });
  187. signIconsForTree(tree);
  188. for (int i = 0; i < tree.getRowCount(); i++) {
  189. tree.expandRow(i);
  190. }
  191. JScrollPane listScroller = new JScrollPane(tree);
  192. contentPanel.add(listScroller);
  193. return contentPanel;
  194. }
  195. private void signIconsForTree(JTree t) {
  196. ImageIcon ClosedIcon = new ImageIcon(Util.loadImage("/Button_Images/Close.png",9,9));
  197. ImageIcon OpenIcon = new ImageIcon(Util.loadImage("/Button_Images/Open.png",9,9));
  198. ImageIcon LeafIcon = new ImageIcon(Util.loadImage("/Button_Images/Leaf.png",9,9));
  199. if (ClosedIcon != null && OpenIcon != null && LeafIcon!= null) {
  200. DefaultTreeCellRenderer renderer =
  201. new DefaultTreeCellRenderer();
  202. renderer.setClosedIcon(ClosedIcon);
  203. renderer.setOpenIcon(OpenIcon);
  204. renderer.setLeafIcon(LeafIcon);
  205. t.setCellRenderer(renderer);
  206. }
  207. }
  208. private void createCategorys(DefaultMutableTreeNode top) {
  209. top.add(objects);
  210. top.add(cables);
  211. top.add(switches);
  212. top.add(nodes);
  213. }
  214. private void popullateCategorys(Model m)
  215. {
  216. m.defineLists();
  217. for(AbstractCpsObject aCps :m.getHolonObjectsOnCanvas())
  218. {
  219. objects.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
  220. }
  221. for(AbstractCpsObject aCps :m.getNodesOnCanvas())
  222. {
  223. nodes.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
  224. }
  225. for(AbstractCpsObject aCps :m.getSwitchsOnCanvas())
  226. {
  227. switches.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
  228. }
  229. for(CpsEdge edge :m.getEdgesOnCanvas())
  230. {
  231. cables.add(new DefaultMutableTreeNode(new EdgeInfo(edge)));
  232. }
  233. }
  234. class MyTreeModelListener implements TreeModelListener {
  235. @Override
  236. public void treeNodesChanged(TreeModelEvent tmE) {
  237. // TODO Auto-generated method stub
  238. System.out.println("treeNodesChanged");
  239. }
  240. @Override
  241. public void treeNodesInserted(TreeModelEvent tmE) {
  242. // TODO Auto-generated method stub
  243. System.out.println("treeNodesInserted");
  244. }
  245. @Override
  246. public void treeNodesRemoved(TreeModelEvent tmE) {
  247. // TODO Auto-generated method stub
  248. System.out.println("treeNodesRemoved");
  249. }
  250. @Override
  251. public void treeStructureChanged(TreeModelEvent tmE) {
  252. // TODO Auto-generated method stub
  253. System.out.println("treeStructureChanged");
  254. }
  255. }
  256. /*
  257. *
  258. * case NO_ENERGY:
  259. stateColor = Color.WHITE;
  260. break;
  261. case NOT_SUPPLIED:
  262. stateColor = new Color(230, 120, 100);
  263. break;
  264. case SUPPLIED:
  265. stateColor = Color.GREEN;
  266. break;
  267. case PRODUCER:
  268. stateColor = Color.lightGray;
  269. break;
  270. case PARTIALLY_SUPPLIED:
  271. stateColor = Color.YELLOW;
  272. break;
  273. case OVER_SUPPLIED:
  274. // find different purple-tones at
  275. // http://www.rapidtables.com/web/color/purple-color.htm
  276. stateColor = new Color(138, 43, 226);
  277. */
  278. private Color getStateColor(HolonObjectState state) {
  279. switch(state) {
  280. case NOT_SUPPLIED:
  281. return new Color(230, 120, 100);
  282. case NO_ENERGY:
  283. return Color.WHITE;
  284. case OVER_SUPPLIED:
  285. return new Color(138, 43, 226);
  286. case PARTIALLY_SUPPLIED:
  287. return Color.YELLOW;
  288. case PRODUCER:
  289. return Color.lightGray;
  290. case SUPPLIED:
  291. return Color.GREEN;
  292. default:
  293. return null;
  294. }
  295. }
  296. @SuppressWarnings("serial")
  297. class ColoredTreeNode extends DefaultMutableTreeNode{
  298. private Color color;
  299. public ColoredTreeNode(String string, String state, Color color) {
  300. //"<html>Some text <font color='red'>" + "bla" + "some text in red</font></html>"
  301. //Integer.toHexString(color.getRGB()).substring(2)
  302. //String c = string + "<html><font bgcolor='#132122'>" + state +"</font></html>";
  303. super(( "<html>" + string + "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + state +"</font></html>"));
  304. //this.color = color;
  305. }
  306. public Color getColor(){
  307. return color;
  308. }
  309. public void setColor(Color color) {
  310. this.color = color;
  311. }
  312. }
  313. class AbstractCpsObjectInfo {
  314. private AbstractCpsObject aCps;
  315. AbstractCpsObjectInfo(AbstractCpsObject aCps){
  316. this.aCps = aCps;
  317. }
  318. @Override
  319. public String toString(){
  320. return aCps.getName() + " Id:"+ aCps.getId();
  321. }
  322. public AbstractCpsObject getAbstractCpsObject()
  323. {
  324. return aCps;
  325. }
  326. }
  327. class EdgeInfo {
  328. private CpsEdge aEdge;
  329. EdgeInfo(CpsEdge aEdge){
  330. this.aEdge = aEdge;
  331. }
  332. @Override
  333. public String toString(){
  334. return aEdge.toString();
  335. }
  336. public CpsEdge getEdge()
  337. {
  338. return aEdge;
  339. }
  340. }
  341. }