UpdateController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package ui.controller;
  2. import classes.*;
  3. import ui.model.DecoratedGroupNode;
  4. import ui.model.DecoratedHolonObject.HolonObjectState;
  5. import ui.model.Model;
  6. import ui.view.DefaulTable;
  7. import ui.view.PropertyTable;
  8. import ui.view.GroupNodeCanvas;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. /**
  12. * This class is for all update methods and more ;)
  13. *
  14. * @author Gruppe14
  15. *
  16. */
  17. public class UpdateController {
  18. Model model;
  19. Control controller;;
  20. public UpdateController(Model model, Control control) {
  21. this.model = model;
  22. this.controller = control;
  23. }
  24. /**
  25. * Update the information concerning properties of the selected CpsObject.
  26. */
  27. public void refreshTableProperties(DefaulTable table) {
  28. if (model.getSelectedObjects().size() == 1) {
  29. AbstractCanvasObject tempCps = model.getSelectedObjects().stream().findFirst().get();
  30. if (tempCps != null && tempCps.getClass() == HolonObject.class) {
  31. if (table.getRowCount() != 0) {
  32. table.removeRow(2);
  33. Object[] tempEnergy = { "Total Energy", ((HolonObject) tempCps).getEnergyNeededFromConsumingElements(model.getCurIteration()) };
  34. table.insertRow(2, tempEnergy);
  35. }
  36. }
  37. }
  38. }
  39. /**
  40. * Erase all information of the HolonElement Model.
  41. *
  42. * @param t
  43. * the Table
  44. */
  45. public void deleteRows(PropertyTable t) {
  46. if (t.getRowCount() > 0) {
  47. for (int i = t.getRowCount() - 1; i > -1; i--) {
  48. t.removeRow(i);
  49. }
  50. }
  51. }
  52. /**
  53. * Search for clicked HolonObject through the mouse's y-Coord.
  54. *
  55. * @param yValue
  56. * the Y Coordination
  57. * @return clicked HolonObject
  58. */
  59. public HolonObject getHolonObj(int yValue, PropertyTable table) {
  60. final int yTemp = (int) Math.floor(yValue / 16);
  61. HolonObject obtTemp = null;
  62. String temp = table.getValueAt(yTemp, 0).toString();
  63. int idTemp = Integer.parseInt(temp.split(", ")[1]);
  64. obtTemp = (HolonObject) controller.searchByID(idTemp);
  65. return obtTemp;
  66. }
  67. /**
  68. * Search for actual selected HolonElement.
  69. *
  70. * @param obj
  71. * selected HolonObject, if obj==null means multi-selection
  72. * active
  73. * @param yValue
  74. * Y-Coord in the HolonElementsTable
  75. * @param toMultiHash
  76. * 0 means no MultiSelection, 1 means MultiSelection without
  77. * Control, 2 means MultiSelection with Control
  78. * @return the selected HolonElement
  79. */
  80. public HolonElement getActualHolonElement(HolonObject obj, int yValue, int toMultiHash,
  81. ArrayList<PropertyTable> tables) {
  82. final int yTemp = (int) Math.floor(yValue / 16);
  83. int rowsTotal = 0;
  84. // Filter for search --> single and multi selection
  85. if (obj == null) {
  86. rowsTotal = tables.get(1).getRowCount();
  87. } else {
  88. rowsTotal = tables.get(0).getRowCount();
  89. }
  90. // search for the clicked HolonObject and HolonElement --> in the
  91. // HolonElementTable
  92. HolonObject obtTemp = null;
  93. HolonElement toReturnEle = null;
  94. int id = 0;
  95. if (rowsTotal != 0 && rowsTotal > yTemp) {
  96. // Multi-Selection search
  97. if (obj == null) {
  98. String tempStringObj = tables.get(1).getValueAt(yTemp, 0).toString();
  99. int idTempObj = Integer.parseInt(tempStringObj.split(", ")[1]);
  100. if (model.getSelectedObjects() != null) {
  101. obtTemp = (HolonObject) getHolonObjSelected(idTempObj);
  102. }
  103. id = Integer.parseInt(tables.get(1).getValueAt(yTemp, 1).toString());
  104. ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
  105. if (model.getEleToDelete().containsKey(idTempObj) && toMultiHash == 2) {
  106. eleTemp = model.getEleToDelete().get(idTempObj);
  107. if (!eleTemp.contains(obtTemp.searchElementById(id))) {
  108. eleTemp.add(obtTemp.searchElementById(id));
  109. model.getEleToDelete().replace(idTempObj, eleTemp);
  110. }
  111. } else if (toMultiHash == 2) {
  112. eleTemp.add(obtTemp.searchElementById(id));
  113. model.getEleToDelete().put(idTempObj, eleTemp);
  114. } else if (toMultiHash == 1) {
  115. model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
  116. eleTemp.add(obtTemp.searchElementById(id));
  117. model.getEleToDelete().put(idTempObj, eleTemp);
  118. } else if (toMultiHash == 0) {
  119. toReturnEle = obtTemp.searchElementById(id);
  120. }
  121. } // Single-Selection search
  122. else {
  123. model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
  124. id = Integer.parseInt(tables.get(0).getValueAt(yTemp, 0).toString());
  125. toReturnEle = obj.searchElementById(id);
  126. }
  127. model.setSelectedHolonElement(toReturnEle);
  128. return toReturnEle;
  129. } // If no HolonObject selected
  130. else {
  131. model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
  132. model.setSelectedHolonElement(null);
  133. return null;
  134. }
  135. }
  136. /**
  137. * Getter for selected CpsObject.
  138. *
  139. * @return selected CpsObject
  140. */
  141. public AbstractCanvasObject getActualCps() {
  142. AbstractCanvasObject tempCps;
  143. if (model.getSelectedObjects().size() == 1) {
  144. tempCps = model.getSelectedObjects().stream().findFirst().get();
  145. } else {
  146. int tempID = model.getSelectedObjectID();
  147. tempCps = controller.searchByID(tempID);
  148. }
  149. return tempCps;
  150. }
  151. /**
  152. * Getter for selected CpsObject.
  153. *
  154. * @return selected CpsObject
  155. */
  156. public AbstractCanvasObject getActualCpsUpperNode(GroupNodeCanvas canvas) {
  157. int tempID = model.getSelectedObjectID();
  158. AbstractCanvasObject tempCps = controller.searchByIDUpperNode(tempID, canvas.getGroupNode());
  159. return tempCps;
  160. }
  161. public void paintProperties(AbstractCanvasObject obj) {
  162. if (obj != null) {
  163. // Name of the CpsObject
  164. Object[] tempName = { "Name", obj.getName() };
  165. model.getPropertyTable().addRow(tempName);
  166. // Id of the CpsObject
  167. Object[] tempId = { "ID", obj.getId() };
  168. model.getPropertyTable().addRow(tempId);
  169. // For HolonObjects the Total Energy (production or
  170. // consumption) is calculated
  171. if (obj instanceof HolonObject) {
  172. Object[] tempEnergy = { "Total Energy", ((HolonObject) obj).getEnergyNeededFromConsumingElements(model.getCurIteration()) };
  173. model.getPropertyTable().addRow(tempEnergy);
  174. model.getPropertyTable().setCellEditable(0, 1, false);
  175. model.getPropertyTable().setCellEditable(2, 1, false);
  176. model.getPropertyTable().setCellEditable(3, 1, false);
  177. model.getPropertyTable().setCellEditable(4, 1, false);
  178. } // For HolonSwitches is showed the actual status (active
  179. // or inactive)
  180. else if (obj instanceof HolonSwitch) {
  181. deleteRows(model.getSingleTable());
  182. deleteRows(model.getMultiTable());
  183. Object[] tempMode = { "Manual", ((HolonSwitch) obj).getManualMode() };
  184. model.getPropertyTable().addRow(tempMode);
  185. if (((HolonSwitch) obj).getManualMode()) {
  186. Object[] tempActive = { "Active", ((HolonSwitch) obj).getManualState() };
  187. model.getPropertyTable().addRow(tempActive);
  188. model.getPropertyTable().setCellEditable(3, 1, true);
  189. } else {
  190. Object[] tempActive = { "Active",
  191. ((HolonSwitch) obj).getState(model.getCurIteration()) };
  192. model.getPropertyTable().addRow(tempActive);
  193. model.getPropertyTable().setCellEditable(3, 1, false);
  194. }
  195. // unitGraph.repaintWithNewSwitch((HolonSwitch) obj);
  196. // elementGraph.setText(obj.getName());
  197. model.getPropertyTable().setCellEditable(0, 1, true);
  198. model.getPropertyTable().setCellEditable(2, 1, true);
  199. } else if (obj instanceof GroupNode) {
  200. deleteRows(model.getSingleTable());
  201. deleteRows(model.getMultiTable());
  202. //short fix please make me new
  203. DecoratedGroupNode dGroupNode = controller.getSimManager().getVisualRepresentationalState(model.getCurIteration()).getCreatedGroupNodes().get((GroupNode) obj);
  204. Object[] info = { "Statistics:", "" };
  205. Object[] numEle = { "Number of Objects (total)", ((GroupNode) obj).getNodes().size() };
  206. Object[] numObj = { "Number of HolonObjects", ((GroupNode) obj).getNumHolonObj().size() };
  207. Object[] numSwi = { "Number of HolonSwitches", ((GroupNode) obj).getNumSwitches().size() };
  208. Object[] numUpp = { "Number of GroupNodes", ((GroupNode) obj).getNumUpperNodes().size() };
  209. model.getPropertyTable().addRow(info);
  210. model.getPropertyTable().addRow(numEle);
  211. model.getPropertyTable().addRow(numObj);
  212. model.getPropertyTable().addRow(numSwi);
  213. model.getPropertyTable().addRow(numUpp);
  214. if(dGroupNode != null) {
  215. int numerator, denominator;
  216. Object[] title = { "HolonObject Statistics:", "" };
  217. denominator = dGroupNode.getAmountOfConsumer() + dGroupNode.getAmountOfSupplier() + dGroupNode.getAmountOfPassiv();
  218. numerator = dGroupNode.getAmountOfSupplier();
  219. Object[] producer = { "Producer:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  220. numerator = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.NOT_SUPPLIED);
  221. Object[] notSupplied = { "UnSupplied:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  222. numerator = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.PARTIALLY_SUPPLIED);
  223. Object[] partiallySupplied = { "PartriallySupplied:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  224. numerator = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.SUPPLIED);
  225. Object[] supplied = { "Supplied:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  226. numerator = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.OVER_SUPPLIED);
  227. Object[] overSupplied = { "OverSupplied:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  228. numerator = dGroupNode.getAmountOfPassiv();
  229. Object[] passiv = { "Passiv(%):", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  230. Object[] nothing= {"", ""};
  231. numerator = dGroupNode.getAmountOfAktiveElemntsFromHolonObjects();
  232. denominator = dGroupNode.getAmountOfElemntsFromHolonObjects();
  233. Object[] aktiv = { "Active HolonElements:", numerator + "/" + denominator + "("+ (float)numerator/(float)denominator * 100 + "%)"};
  234. float consumption = dGroupNode.getConsumptionFromConsumer();
  235. float production = dGroupNode.getProductionFromSupplier();
  236. Object[] consumptionObj = { "Total Consumption:", consumption};
  237. Object[] productionObj = { "Total Production:", production};
  238. Object[] difference = { "Difference:", production - consumption};
  239. model.getPropertyTable().addRow(title);
  240. model.getPropertyTable().addRow(producer);
  241. model.getPropertyTable().addRow(notSupplied);
  242. model.getPropertyTable().addRow(partiallySupplied);
  243. model.getPropertyTable().addRow(supplied);
  244. model.getPropertyTable().addRow(overSupplied);
  245. model.getPropertyTable().addRow(passiv);
  246. model.getPropertyTable().addRow(nothing);
  247. model.getPropertyTable().addRow(aktiv);
  248. model.getPropertyTable().addRow(nothing);
  249. model.getPropertyTable().addRow(consumptionObj);
  250. model.getPropertyTable().addRow(productionObj);
  251. model.getPropertyTable().addRow(difference);
  252. }
  253. } else {
  254. deleteRows(model.getSingleTable());
  255. deleteRows(model.getMultiTable());
  256. }
  257. // For Objects the only editable cell is the name
  258. ArrayList<Edge> tempArray = obj.getConnections();
  259. // If the clicked object has connections
  260. if (!tempArray.isEmpty()) {
  261. boolean first = true;
  262. for (Edge temp2 : tempArray) {
  263. if (first) {
  264. first = false;
  265. if (obj.getId() != temp2.getA().getId()) {
  266. Object[] tempConnection = { obj.getName() + " is connected to",
  267. temp2.getA().getName() + " with ID: " + temp2.getA().getId() };
  268. model.getPropertyTable().addRow(tempConnection);
  269. } else {
  270. Object[] tempConnection = { obj.getName() + " is connected to",
  271. temp2.getB().getName() + " with ID: " + temp2.getB().getId() };
  272. model.getPropertyTable().addRow(tempConnection);
  273. }
  274. } else {
  275. if (obj.getId() != temp2.getA().getId()) {
  276. Object[] tempConnection = { "",
  277. temp2.getA().getName() + " with ID: " + temp2.getA().getId() };
  278. model.getPropertyTable().addRow(tempConnection);
  279. } else {
  280. Object[] tempConnection = { "",
  281. temp2.getB().getName() + " with ID: " + temp2.getB().getId() };
  282. model.getPropertyTable().addRow(tempConnection);
  283. }
  284. }
  285. }
  286. }
  287. } // If the clicked Object is an edge
  288. else if (model.getSelectedEdge() != null) {
  289. // Name displayed
  290. Object[] tempName = { "Name",
  291. "Edge: " + model.getSelectedEdge().getA().getName() + " to "
  292. + model.getSelectedEdge().getB().getName() };
  293. model.getPropertyTable().addRow(tempName);
  294. // Current Flow displayed
  295. Object[] tempFlow = { "Current flow", "" };
  296. model.getPropertyTable().addRow(tempFlow);
  297. // Max Capacity displayed
  298. Object[] tempCapacity = { "Max. Capacity", model.getSelectedEdge().getCapacity() };
  299. model.getPropertyTable().addRow(tempCapacity);
  300. // Status displayed
  301. Object[] tempStatus = {"Length", model.getSelectedEdge().getLength() };
  302. model.getPropertyTable().addRow(tempStatus);
  303. // For edges, the only possible editable cell is the max
  304. // flow
  305. model.getPropertyTable().setCellEditable(0, 1, false);
  306. model.getPropertyTable().setCellEditable(2, 1, true);
  307. model.getPropertyTable().setCellEditable(3, 1, true);
  308. } else if (getActualCps() == null) {
  309. deleteRows(model.getSingleTable());
  310. deleteRows(model.getMultiTable());
  311. }
  312. // Update of the HolonElementTable (Single- or Multi-Selection)
  313. }
  314. public AbstractCanvasObject getHolonObjSelected(int id) {
  315. AbstractCanvasObject obj = null;
  316. for (AbstractCanvasObject o : model.getSelectedObjects()) {
  317. if (o.getId() == id) {
  318. obj = o;
  319. break;
  320. }
  321. }
  322. return obj;
  323. }
  324. }