Outliner.java 13 KB

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