GUI.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Cursor;
  6. import java.awt.Dimension;
  7. import java.awt.Image;
  8. import java.awt.Point;
  9. import java.awt.Toolkit;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.MouseAdapter;
  13. import java.awt.event.MouseEvent;
  14. import java.beans.PropertyChangeEvent;
  15. import java.beans.PropertyChangeListener;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.util.ArrayList;
  19. import javax.swing.BoxLayout;
  20. import javax.swing.DefaultComboBoxModel;
  21. import javax.swing.ImageIcon;
  22. import javax.swing.JButton;
  23. import javax.swing.JCheckBoxMenuItem;
  24. import javax.swing.JComboBox;
  25. import javax.swing.JEditorPane;
  26. import javax.swing.JFileChooser;
  27. import javax.swing.JFrame;
  28. import javax.swing.JLabel;
  29. import javax.swing.JMenu;
  30. import javax.swing.JMenuBar;
  31. import javax.swing.JMenuItem;
  32. import javax.swing.JOptionPane;
  33. import javax.swing.JPanel;
  34. import javax.swing.JPopupMenu;
  35. import javax.swing.JScrollPane;
  36. import javax.swing.JSlider;
  37. import javax.swing.JSplitPane;
  38. import javax.swing.JTabbedPane;
  39. import javax.swing.JTable;
  40. import javax.swing.JTextField;
  41. import javax.swing.JToolBar;
  42. import javax.swing.JTree;
  43. import javax.swing.SwingUtilities;
  44. import javax.swing.border.LineBorder;
  45. import javax.swing.event.ChangeEvent;
  46. import javax.swing.event.ChangeListener;
  47. import javax.swing.filechooser.FileNameExtensionFilter;
  48. import javax.swing.table.DefaultTableModel;
  49. import javax.swing.tree.DefaultMutableTreeNode;
  50. import javax.swing.tree.DefaultTreeModel;
  51. import javax.swing.tree.TreeCellRenderer;
  52. import Interfaces.CategoryListener;
  53. import classes.Category;
  54. import classes.CpsEdge;
  55. import classes.CpsObject;
  56. import classes.HolonElement;
  57. import classes.HolonObject;
  58. import classes.HolonSwitch;
  59. import classes.HolonTransformer;
  60. import ui.controller.Control;
  61. import ui.model.Model;;
  62. public class GUI<E> implements CategoryListener {
  63. private JFrame frmCyberPhysical;
  64. private final JMenuBar menuBar = new JMenuBar();
  65. private final JMenu mnNewMenu = new JMenu("File");
  66. private final JMenu mnNewMenu_1 = new JMenu("Edit");
  67. private final JMenu mnNewMenu_2 = new JMenu("Options");
  68. private final JMenu mnNewMenu_3 = new JMenu("View");
  69. private final JMenu mnHelp = new JMenu("Help");
  70. private final JMenuItem mntmOpen = new JMenuItem("Open");
  71. private final JMenuItem mntmNew = new JMenuItem("New");
  72. private final JMenuItem mntmSave = new JMenuItem("Save");
  73. private final JMenuItem aboutUs = new JMenuItem("About Us");
  74. private final JMenuItem canvasSize = new JMenuItem("View Size");
  75. private final JSplitPane splitPane = new JSplitPane();
  76. private final JSplitPane splitPane_1 = new JSplitPane();
  77. private final JScrollPane scrollPane_1 = new JScrollPane();
  78. private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
  79. private final JScrollPane scrollPane_2 = new JScrollPane();
  80. private JPopupMenu popmenuEdit = new JPopupMenu();
  81. private JMenuItem editItem = new JMenuItem("Edit Object");
  82. private String catOfObjToBeEdited;
  83. private final JLabel maxGraph = new JLabel("100%");
  84. private final JLabel medGraph = new JLabel("50%");
  85. private final JLabel minGraph = new JLabel("0%");
  86. private final JLabel elementGraph = new JLabel("None ");
  87. private final ArrayList<HolonElement> selectedElements = new ArrayList<HolonElement>();
  88. private String holonEleNamesDisplayed = "None ";
  89. private final JTree tree = new JTree();
  90. private final JEditorPane dtrpnHereWillBe = new JEditorPane();
  91. /******************************************
  92. ************* Right Container*************
  93. ******************************************/
  94. // Right Container: here comes the information about the HolonObject, such
  95. // as HolonElements Information, Properties and Consumption/Production graph
  96. private final JSplitPane split_HolonEl_Pro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  97. private final JSplitPane split_Graph_HolonEl = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  98. // In this section are all the Holonelements that correspond to the clicked
  99. // HolonObject with consumption/production, name and amount.
  100. private JTable tableHolonElement = new JTable();
  101. private PropertyTable tableModelHolonElement = new PropertyTable();
  102. private final JPanel scrollElements = new JPanel();
  103. private JScrollPane tableHolonElementScrollPane = new JScrollPane();
  104. // In this section are all the properties that correspond to the clicked
  105. // HolonObject, such as connections, name, Type, etc.
  106. private JTable tableProperties = new JTable();
  107. private JPanel graphLabel = new JPanel();
  108. private DefaulTable tableModelProperties;
  109. private final JScrollPane scrollProperties = new JScrollPane();
  110. // In this section is the graph for the selected HolonElement of the clicked
  111. // HolonObject
  112. private JTable tableGraph = new JTable();
  113. private DefaultTableModel tableModelGraph = new DefaultTableModel();
  114. private final JScrollPane scrollGraph = new JScrollPane();
  115. private Model model;
  116. private final Control controller;
  117. // Pop up Windows
  118. private AddObjectPopUp addObjectPopUP;
  119. private AboutUsPopUp aboutUsPopUp;
  120. private AddElementPopUp addElementPopUp;
  121. private final JPanel panel = new JPanel();
  122. private final JPanel panel_HolonEl = new JPanel();
  123. private final JComboBox comboBox = new JComboBox();
  124. // private final JComboBox comboBoxGraph = new JComboBox();
  125. // Buttons
  126. private final JButton btnAdd = new JButton("+");
  127. private final JButton btnDel = new JButton("-");
  128. private final JButton btnAddHolEL = new JButton("+");
  129. private final JButton btnDelHolEL = new JButton("-");
  130. private final JButton resetGraphBtn = new JButton("Reset");
  131. private final JToolBar toolBar = new JToolBar();
  132. private final JToolBar toolBarHolonEl = new JToolBar();
  133. private final JToolBar toolBarGraph = new JToolBar();
  134. // variables
  135. private boolean dragging = false;
  136. private String actualObjectClicked;
  137. private Image img = null;
  138. private CpsObject tempCps = null;
  139. private HolonElement tempElement = null;
  140. private int yValueElements = 0;
  141. private MyCanvas canvas;
  142. private UnitGraph unitGraph;
  143. private final JSplitPane splitPane_3 = new JSplitPane();
  144. private final JSlider sizeSlider = new JSlider();
  145. private final JLabel lblImageSize = new JLabel("Image Size");
  146. // Time Stuff
  147. private TimePanel timePanel;
  148. private final JMenu mnAlgorithm = new JMenu("Algorithm");
  149. private final JCheckBoxMenuItem chckbxmntmUseAlgorithm = new JCheckBoxMenuItem("Use Algorithm");
  150. private final JSplitPane splitPane_2 = new JSplitPane();
  151. private final JLabel lblSelect = new JLabel("Select");
  152. private final JComboBox comboBoxAlgo = new JComboBox();
  153. private int yTHIS;
  154. private int xTHIS;
  155. private int yBTHIS;
  156. private int xBTHIS;
  157. private CpsObject temp = null;
  158. private final JButton btnTest = new JButton("test");
  159. private final JMenuItem mntmUndo = new JMenuItem("Undo");
  160. private final JMenuItem mntmRedo = new JMenuItem("Redo");
  161. /**
  162. * Create the application.
  163. */
  164. public GUI(Control control) {
  165. this.controller = control;
  166. this.model = control.getModel();
  167. this.canvas = new MyCanvas(model, control);
  168. this.unitGraph = new UnitGraph(model, control);
  169. control.initListener(this);
  170. initialize();
  171. updateCategories(model.getCategories());
  172. controller.setCanvas(canvas);
  173. }
  174. /**
  175. * Initialize the contents of the frame.
  176. */
  177. @SuppressWarnings({ "serial", "unchecked" })
  178. private void initialize() {
  179. frmCyberPhysical = new JFrame();
  180. frmCyberPhysical.setTitle("Cyber Physical Systems Model");
  181. frmCyberPhysical.setBounds(100, 100, 1000, 800);
  182. // frmCyberPhysical.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  183. frmCyberPhysical.addWindowListener(new java.awt.event.WindowAdapter() {
  184. @Override
  185. public void windowClosing(java.awt.event.WindowEvent windowEvent) {
  186. if (JOptionPane.showConfirmDialog(frmCyberPhysical, "Are you sure to close this window?",
  187. "Really Closing?", JOptionPane.YES_NO_OPTION,
  188. JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
  189. deleteDirectory(new File(System.getProperty("user.home") + "/HolonGUI/Autosave"));
  190. System.exit(0);
  191. }
  192. }
  193. private void deleteDirectory(File path) {
  194. if (path.exists()) {
  195. File[] files = path.listFiles();
  196. for (int i = 0; i < files.length; i++) {
  197. if (files[i].isDirectory()) {
  198. deleteDirectory(files[i]);
  199. } else {
  200. files[i].delete();
  201. }
  202. }
  203. }
  204. }
  205. });
  206. frmCyberPhysical.setJMenuBar(menuBar);
  207. frmCyberPhysical.setIconImage(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage()
  208. .getScaledInstance(30, 30, Image.SCALE_SMOOTH));
  209. menuBar.add(mnNewMenu);
  210. mnNewMenu.add(mntmNew);
  211. mnNewMenu.add(mntmOpen);
  212. mnNewMenu.add(mntmSave);
  213. menuBar.add(mnNewMenu_1);
  214. mnNewMenu_1.add(mntmUndo);
  215. mnNewMenu_1.add(mntmRedo);
  216. menuBar.add(mnNewMenu_2);
  217. menuBar.add(mnNewMenu_3);
  218. mnNewMenu_3.add(canvasSize);
  219. canvasSize.addActionListener(new ActionListener() {
  220. @Override
  221. public void actionPerformed(ActionEvent e) {
  222. JPanel myPanel = new JPanel();
  223. JTextField field1 = new JTextField("" + canvas.getWidth() + "");
  224. JTextField field2 = new JTextField("" + canvas.getHeight() + "");
  225. myPanel.add(field1);
  226. myPanel.add(field2);
  227. JOptionPane.showMessageDialog(null, myPanel);
  228. canvas.setPreferredSize(
  229. new Dimension(Integer.parseInt(field1.getText()), Integer.parseInt(field2.getText())));
  230. canvas.repaint();
  231. }
  232. });
  233. mnNewMenu_3.add(splitPane_3);
  234. sizeSlider.setMinimum(15);
  235. sizeSlider.setMaximum(115);
  236. sizeSlider.addChangeListener(new ChangeListener() {
  237. @Override
  238. public void stateChanged(ChangeEvent e) {
  239. controller.setScale(sizeSlider.getValue());
  240. tree.setRowHeight(model.getScale());
  241. canvas.objectSelectionHighlighting();
  242. canvas.repaint();
  243. }
  244. });
  245. splitPane_3.setRightComponent(sizeSlider);
  246. splitPane_3.setLeftComponent(lblImageSize);
  247. menuBar.add(mnHelp);
  248. mnHelp.add(aboutUs);
  249. menuBar.add(mnAlgorithm);
  250. mnAlgorithm.add(chckbxmntmUseAlgorithm);
  251. mnAlgorithm.add(splitPane_2);
  252. splitPane_2.setLeftComponent(lblSelect);
  253. splitPane_2.setRightComponent(comboBoxAlgo);
  254. canvas.setBackground(Color.WHITE);
  255. canvas.setPreferredSize(new Dimension(1000, 1000));
  256. JScrollPane canvasSP = new JScrollPane(canvas);
  257. canvasSP.setBorder(null);
  258. tabbedPane.addTab("Modeling", new ImageIcon(new ImageIcon(this.getClass().getResource("/Images/home.png"))
  259. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)), canvasSP, "Model a CPS");
  260. tabbedPane.addTab("Simulation",
  261. new ImageIcon(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage()
  262. .getScaledInstance(30, 30, Image.SCALE_SMOOTH)),
  263. scrollPane_2, "Simulate the CPS");
  264. dtrpnHereWillBe.setText("Here will be the Simulation");
  265. scrollPane_2.setViewportView(dtrpnHereWillBe);
  266. /********************
  267. * RIGHT CONTAINER (INFORMATION)
  268. **********************/
  269. // Set up of the HolonElements section
  270. Object[] columnNames = { "Device", "Energy", "Quantity", "Activated" };
  271. tableModelHolonElement.setColumnIdentifiers(columnNames);
  272. tableHolonElement.setBorder(null);
  273. tableHolonElement.setModel(tableModelHolonElement);
  274. tableHolonElement.setFillsViewportHeight(true);
  275. tableHolonElement.setCellSelectionEnabled(true);
  276. tableHolonElement.setColumnSelectionAllowed(true);
  277. tableHolonElementScrollPane.setViewportView(tableHolonElement);
  278. scrollElements.setLayout(new BorderLayout(0, 0));
  279. scrollElements.add(panel_HolonEl, BorderLayout.NORTH);
  280. scrollElements.add(tableHolonElementScrollPane);
  281. panel_HolonEl.setLayout(new BoxLayout(panel_HolonEl, BoxLayout.X_AXIS));
  282. toolBarHolonEl.add(btnAddHolEL);
  283. toolBarHolonEl.add(btnDelHolEL);
  284. toolBarHolonEl.setFloatable(false);
  285. panel_HolonEl.add(toolBarHolonEl);
  286. // Set up of the Properties section
  287. Object[] colNames = { "Field", "Information" };
  288. tableModelProperties = new DefaulTable(100, colNames.length);
  289. tableModelProperties.setColumnIdentifiers(colNames);
  290. tableProperties.setModel(tableModelProperties);
  291. tableProperties.setFillsViewportHeight(true);
  292. tableProperties.setCellSelectionEnabled(true);
  293. tableProperties.setColumnSelectionAllowed(true);
  294. scrollProperties.setViewportView(tableProperties);
  295. // Set up of the Graph section
  296. Object[] tempText = { "Here comes the graph for each clicked HolonElement" };
  297. tableModelGraph.setColumnIdentifiers(tempText);
  298. tableGraph.setModel(tableModelGraph);
  299. tableGraph.setFillsViewportHeight(true);
  300. tableGraph.setCellSelectionEnabled(true);
  301. tableGraph.setColumnSelectionAllowed(true);
  302. scrollGraph.setViewportView(unitGraph);
  303. graphLabel.setLayout(new BorderLayout(0, 10));
  304. graphLabel.add(maxGraph, BorderLayout.NORTH);
  305. graphLabel.add(medGraph, BorderLayout.CENTER);
  306. graphLabel.add(minGraph, BorderLayout.SOUTH);
  307. toolBarGraph.add(elementGraph);
  308. toolBarGraph.add(resetGraphBtn);
  309. toolBarGraph.setFloatable(false);
  310. scrollGraph.setRowHeaderView(graphLabel);
  311. scrollGraph.setColumnHeaderView(toolBarGraph);
  312. /***********************
  313. * HolonElement Table Actions
  314. **********************/
  315. /*
  316. * Add HolonElement to given HolonObject
  317. */
  318. btnAddHolEL.addActionListener(new ActionListener() {
  319. public void actionPerformed(ActionEvent arg0) {
  320. CpsObject tempCpsObject = getActualCps();
  321. if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
  322. && tempCpsObject.getID() != 0) {
  323. addElementPopUp = new AddElementPopUp();
  324. addElementPopUp.setActualCps(getActualCps());
  325. addElementPopUp.setVisible(true);
  326. HolonElement ele = addElementPopUp.getElement();
  327. controller.addElementCanvasObject(tempCpsObject.getID(), ele.getEleName(), ele.getAmount(),
  328. ele.getEnergy());
  329. refreshTableHolonElement();
  330. refreshTableProperties();
  331. controller.calculateStateForTimeStep(model.getCurIteration());
  332. }
  333. }
  334. });
  335. /*
  336. * Delete the choosen HolonElement of the selected HolonObject
  337. */
  338. btnDelHolEL.addActionListener(new ActionListener() {
  339. public void actionPerformed(ActionEvent arg0) {
  340. if (getActualCps().getClass() == HolonObject.class) {
  341. HolonObject obj = (HolonObject) getActualCps();
  342. tempElement = getActualHolonElement(obj, yValueElements);
  343. if (tempElement != null && obj.getClass() == HolonObject.class && obj.getID() != 0) {
  344. controller.deleteElementCanvas(obj.getID(), tempElement.getEleName());
  345. refreshTableHolonElement();
  346. refreshTableProperties();
  347. controller.calculateStateForTimeStep(model.getCurIteration());
  348. }
  349. }
  350. }
  351. });
  352. /*
  353. * Communication between HolonElement Table and displayed Graph
  354. */
  355. tableHolonElement.addMouseListener(new MouseAdapter() {
  356. public void mousePressed(MouseEvent e) {
  357. HolonObject obj = (HolonObject) getActualCps();
  358. yValueElements = e.getY();
  359. HolonElement ele = getActualHolonElement(obj, yValueElements);
  360. if (e.isControlDown() && ele != null) {
  361. if (!selectedElements.contains(ele)) {
  362. selectedElements.add(ele);
  363. if (!holonEleNamesDisplayed.equals("None ")) {
  364. holonEleNamesDisplayed = holonEleNamesDisplayed + "; " + ele.getEleName() + " ";
  365. } else {
  366. holonEleNamesDisplayed = ele.getEleName() + " ";
  367. }
  368. unitGraph.repaintWithNewElement(selectedElements);
  369. }
  370. } else if (ele != null) {
  371. selectedElements.clear();
  372. selectedElements.add(ele);
  373. holonEleNamesDisplayed = ele.getEleName() + " ";
  374. unitGraph.repaintWithNewElement(selectedElements);
  375. } else {
  376. elementGraph.setText("None ");
  377. unitGraph.empty();
  378. }
  379. // if any HolonElement is double-clicked --> Edit instance of
  380. // selected HolonElement
  381. if (e.getClickCount() == 2) {
  382. yTHIS = e.getY();
  383. xTHIS = e.getX();
  384. }
  385. if (e.getClickCount() == 1 && ele == null) {
  386. selectedElements.clear();
  387. holonEleNamesDisplayed = "None ";
  388. }
  389. for (int i = 0; i < selectedElements.size(); i++) {
  390. if (i == 0) {
  391. System.out.println("Selected Items: " + selectedElements.get(i).getEleName());
  392. } else {
  393. System.out.println(selectedElements.get(i).getEleName());
  394. }
  395. }
  396. elementGraph.setText(holonEleNamesDisplayed);
  397. yBTHIS = e.getY();
  398. xBTHIS = e.getX();
  399. }
  400. });
  401. /*
  402. * If the HolonElement Table enters to editing instance, than is the
  403. * propertyChangeListener triggered
  404. */
  405. tableHolonElement.addPropertyChangeListener(new PropertyChangeListener() {
  406. @Override
  407. public void propertyChange(PropertyChangeEvent evt) {
  408. try {
  409. int yMouse = yTHIS;
  410. int yBMouse = yBTHIS;
  411. int selectedValueX = (int) Math.floor(xTHIS / (tableHolonElement.getWidth() / 4));
  412. int selectedValueY = (int) Math.floor(yMouse / 16);
  413. int selectedValueBX = (int) Math.floor(xBTHIS / (tableHolonElement.getWidth() / 4));
  414. int selectedValueBY = (int) Math.floor(yBMouse / 16);
  415. if (getActualCps() != null && getActualCps().getClass() == HolonObject.class) {
  416. if (selectedValueBX == 3) {
  417. HolonElement eleBTemp = getActualHolonElement((HolonObject) getActualCps(), yBMouse);
  418. String newBStuff = tableModelHolonElement.getValueAt(selectedValueBY, selectedValueBX)
  419. .toString();
  420. Boolean bTemp = Boolean.parseBoolean(newBStuff);
  421. eleBTemp.setActive(bTemp);
  422. } else {
  423. HolonElement eleTemp = getActualHolonElement((HolonObject) getActualCps(), yMouse);
  424. String newStuff = tableModelHolonElement.getValueAt(selectedValueY, selectedValueX)
  425. .toString();
  426. if (selectedValueX == 0) {
  427. eleTemp.setEleName(newStuff);
  428. } else if (selectedValueX == 1) {
  429. Float ftemp = Float.parseFloat(newStuff);
  430. eleTemp.setEnergy(ftemp);
  431. } else if (selectedValueX == 2) {
  432. Integer iTemp = Integer.parseInt(newStuff);
  433. eleTemp.setAmount(iTemp);
  434. }
  435. }
  436. refreshTableProperties();
  437. tableModelHolonElement.fireTableDataChanged();
  438. controller.calculateStateForTimeStep(model.getCurIteration());
  439. unitGraph.repaint();
  440. }
  441. } catch (Exception e) {
  442. }
  443. }
  444. });
  445. /***********************
  446. * HolonElement Properties Actions
  447. **********************/
  448. /*
  449. * If any value at the Properties Table enters to editing instance, than
  450. * is PropertyChangeListener triggered (For HolonObject, the only value
  451. * to be edited is the name and for CpsEdge the Max.flow)
  452. */
  453. tableProperties.addPropertyChangeListener(new PropertyChangeListener() {
  454. @Override
  455. public void propertyChange(PropertyChangeEvent evt) {
  456. try {
  457. Object temp;
  458. if (getActualCps() != null) {
  459. if (getActualCps() instanceof HolonObject) {
  460. temp = tableModelProperties.getValueAt(0, 1);
  461. getActualCps().setName(temp.toString());
  462. } else if (getActualCps() instanceof HolonTransformer) {
  463. // get Info of the Properties for Transformer
  464. }
  465. } else {
  466. temp = tableModelProperties.getValueAt(2, 1);
  467. Float ftemp = Float.parseFloat(temp.toString());
  468. model.getSelectedEdge().setCapacity(ftemp);
  469. }
  470. canvas.repaint();
  471. } catch (Exception e) {
  472. }
  473. }
  474. });
  475. /***********************
  476. * HolonElement Graph Actions
  477. **********************/
  478. /*
  479. * Reset the graph of the selected HolonElement
  480. */
  481. resetGraphBtn.setBorder(new LineBorder(Color.BLACK));
  482. resetGraphBtn.addActionListener(new ActionListener() {
  483. public void actionPerformed(ActionEvent arg0) {
  484. unitGraph.reset();
  485. }
  486. });
  487. /*****************************
  488. * RIGHT CONTAINER DONE
  489. *****************************/
  490. frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0));
  491. TreeCellRenderer customRenderer = new TreeCellRenderer() {
  492. @Override
  493. public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
  494. boolean leaf, int row, boolean hasFocus) {
  495. JLabel label = new JLabel();
  496. Image imgR = null;
  497. if (leaf) {
  498. for (Category cat : model.getCategories()) {
  499. for (CpsObject cps : cat.getObjects()) {
  500. if (value.toString().compareTo(cps.getObjName()) == 0) {
  501. File checkPath = new File(cps.getImage());
  502. if (checkPath.exists()) {
  503. imgR = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
  504. controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH);
  505. } else {
  506. imgR = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
  507. .getScaledInstance(controller.getScale(), controller.getScale(),
  508. java.awt.Image.SCALE_SMOOTH);
  509. }
  510. if (imgR != null) {
  511. label.setIcon(new ImageIcon(imgR));
  512. }
  513. label.setText(cps.getName());
  514. }
  515. }
  516. }
  517. }
  518. tree.setRowHeight(model.getScale());
  519. if (hasFocus) {
  520. label.setForeground(new Color(0, 0, 255));
  521. label.setOpaque(true);
  522. }
  523. if (label.getText().length() == 0) {
  524. label.setText(value.toString());
  525. if (value.toString().compareTo("Categories") != 0) {
  526. label.setIcon(new ImageIcon(this.getClass().getResource("/Images/folder.png")));
  527. }
  528. }
  529. return label;
  530. }
  531. };
  532. tree.setCellRenderer(customRenderer);
  533. tree.addMouseListener(new MouseAdapter() {
  534. public void mouseReleased(MouseEvent e) {
  535. try {
  536. if (dragging) {
  537. int x = (int) canvas.getMousePosition().getX();
  538. int y = (int) canvas.getMousePosition().getY();
  539. CpsObject h = null;
  540. if (tempCps.getClass() == HolonObject.class) {
  541. h = new HolonObject(tempCps);
  542. }
  543. if (tempCps.getClass() == HolonSwitch.class) {
  544. h = new HolonSwitch(tempCps);
  545. }
  546. if (tempCps.getClass() == HolonTransformer.class) {
  547. h = new HolonTransformer(tempCps);
  548. }
  549. h.setPosition(x, y);
  550. controller.addObjectCanvas(h);
  551. canvas.repaint();
  552. dragging = false;
  553. }
  554. } catch (Exception e2) {
  555. }
  556. frmCyberPhysical.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
  557. }
  558. });
  559. popmenuEdit.add(editItem);
  560. editItem.setEnabled(false);
  561. editItem.addActionListener(new ActionListener() {
  562. @Override
  563. public void actionPerformed(ActionEvent e) {
  564. }
  565. });
  566. tree.addMouseListener(new MouseAdapter() {
  567. public void mousePressed(MouseEvent e) {
  568. try {
  569. actualObjectClicked = tree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent().toString();
  570. // if an Object was selected, the porperties are shown in
  571. // the table
  572. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
  573. .getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
  574. if (selectedNode.getLevel() == 2) {
  575. CpsObject selected = controller.searchCategoryObject(selectedNode.getParent().toString(),
  576. selectedNode.toString());
  577. deleteRows();
  578. // if (selected instanceof HolonObject && selected !=
  579. // null) {
  580. // selected = (HolonObject) selected;
  581. // fillElementTable(((HolonObject)
  582. // selected).getElements());
  583. // }
  584. }
  585. if (SwingUtilities.isRightMouseButton(e)) {
  586. for (Category cat : model.getCategories()) {
  587. for (CpsObject cps : cat.getObjects()) {
  588. if (actualObjectClicked.compareTo(cps.getObjName()) == 0
  589. && !(cps instanceof HolonSwitch)) {
  590. editItem.setEnabled(true);
  591. popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
  592. catOfObjToBeEdited = selectedNode.getParent().toString();
  593. tempCps = cps;
  594. }
  595. }
  596. }
  597. } else {
  598. for (Category cat : model.getCategories()) {
  599. for (CpsObject cps : cat.getObjects()) {
  600. if (actualObjectClicked.compareTo(cps.getObjName()) == 0) {
  601. File checkPath = new File(cps.getImage());
  602. if (checkPath.exists()) {
  603. img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
  604. controller.getScale(), controller.getScale(),
  605. java.awt.Image.SCALE_SMOOTH);
  606. } else {
  607. img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
  608. .getScaledInstance(controller.getScale(), controller.getScale(),
  609. java.awt.Image.SCALE_SMOOTH);
  610. }
  611. tempCps = cps;
  612. dragging = true;
  613. Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0),
  614. "Image");
  615. frmCyberPhysical.setCursor(cursor);
  616. }
  617. }
  618. }
  619. }
  620. } catch (Exception e2) {
  621. }
  622. }
  623. });
  624. editItem.addActionListener(new ActionListener() {
  625. @Override
  626. public void actionPerformed(ActionEvent e) {
  627. // Remove the selected Object object
  628. addObjectPopUP = new AddObjectPopUp(true, tempCps, catOfObjToBeEdited);
  629. addObjectPopUP.setCategory(catOfObjToBeEdited);
  630. addObjectPopUP.setController(controller);
  631. addObjectPopUP.setVisible(true);
  632. }
  633. });
  634. scrollPane_1.setViewportView(tree);
  635. scrollPane_1.setColumnHeaderView(panel);
  636. panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
  637. toolBar.setFloatable(false);
  638. panel.add(toolBar);
  639. toolBar.add(comboBox);
  640. comboBox.setModel(new DefaultComboBoxModel(new String[] { "Category", "Object", "Transformer", "Switch" }));
  641. // Add Button
  642. btnAdd.addActionListener(new ActionListener() {
  643. public void actionPerformed(ActionEvent arg0) {
  644. Object nodeInfo = tree.getLastSelectedPathComponent();
  645. String selectedOption = comboBox.getSelectedItem().toString();
  646. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
  647. switch (selectedOption) {
  648. case "Category":
  649. String catName = JOptionPane.showInputDialog("Please enter a Name for Category ");
  650. if (catName.length() != 0) {
  651. controller.addCategory(catName);
  652. }
  653. break;
  654. case "Object":
  655. if (selectedNode == null) {
  656. JOptionPane.showMessageDialog(new JFrame(),
  657. "Please select a Category first before adding " + selectedOption + ".");
  658. }
  659. if (selectedNode.getLevel() == 1) {
  660. CpsObject tmp = new HolonObject("");
  661. addObjectPopUP = new AddObjectPopUp(false, tmp, null);
  662. addObjectPopUP.setVisible(true);
  663. addObjectPopUP.setController(controller);
  664. addObjectPopUP.setCategory(selectedNode.toString());
  665. }
  666. break;
  667. default:
  668. addObjectAction(selectedOption, selectedNode);
  669. break;
  670. }
  671. tree.repaint();
  672. }
  673. });
  674. /**
  675. * Pop up - About Us with some important information about the
  676. * developers, source and programming stuff
  677. */
  678. aboutUs.addMouseListener(new MouseAdapter() {
  679. @Override
  680. public void mousePressed(MouseEvent e) {
  681. aboutUsPopUp = new AboutUsPopUp();
  682. aboutUsPopUp.setVisible(true);
  683. }
  684. });
  685. /**
  686. * Update of every interaction between the user and the canvas (only on
  687. * the canvas). Basically the update of all the information concerning
  688. * the clicked HolonObject
  689. */
  690. canvas.addMouseListener(new MouseAdapter() {
  691. @Override
  692. public void mousePressed(MouseEvent e) {
  693. if (temp == null || temp.getID() != model.getSelectedObjectID()) {
  694. unitGraph.empty();
  695. elementGraph.setText("None ");
  696. }
  697. temp = getActualCps();
  698. // Update of the Information about the HolonElements - only for
  699. // if (temp instanceof HolonObject) {
  700. // refreshTableHolonElement();
  701. // }
  702. // Update of the Information about the Properties - only for
  703. // CpsObjects
  704. // Erase old data
  705. if (tableModelProperties.getRowCount() > 0) {
  706. for (int i = tableModelProperties.getRowCount() - 1; i > -1; i--) {
  707. tableModelProperties.removeRow(i);
  708. }
  709. }
  710. // Write new data
  711. if (temp != null) {
  712. Object[] tempName = { "Name", temp.getName() };
  713. tableModelProperties.addRow(tempName);
  714. Object[] tempId = { "ID", temp.getID() };
  715. tableModelProperties.addRow(tempId);
  716. if (temp instanceof HolonObject) {
  717. refreshTableHolonElement();
  718. Object[] tempEnergy = { "Total Energy", ((HolonObject) temp).getCurrentEnergy() };
  719. tableModelProperties.addRow(tempEnergy);
  720. } else if (temp instanceof HolonTransformer) {
  721. deleteRows();
  722. Object[] tempRatioPerc = { "Ratio Type", true };
  723. tableModelProperties.addRow(tempRatioPerc);
  724. } else if (temp instanceof HolonSwitch) {
  725. deleteRows();
  726. Object[] tempActive = { "Active", ((HolonSwitch) temp).getActiveAt()[model.getCurIteration()] };
  727. tableModelProperties.addRow(tempActive);
  728. unitGraph.repaintWithNewSwitch((HolonSwitch) temp);
  729. elementGraph.setText(temp.getName());
  730. } else {
  731. deleteRows();
  732. }
  733. tableModelProperties.setCellEditable(0, 1, true);
  734. tableModelProperties.setCellEditable(2, 1, false);
  735. ArrayList<CpsEdge> temp_array = temp.getConnections();
  736. if (!temp_array.isEmpty()) {
  737. boolean first = true;
  738. for (CpsEdge temp2 : temp_array) {
  739. if (first) {
  740. first = false;
  741. if (temp.getID() != temp2.getA().getID()) {
  742. Object[] tempConnection = { temp.getName() + " is connected to",
  743. temp2.getA().getName() + " with ID: " + temp2.getA().getID() };
  744. tableModelProperties.addRow(tempConnection);
  745. } else {
  746. Object[] tempConnection = { temp.getName() + " is connected to",
  747. temp2.getB().getName() + " with ID: " + temp2.getB().getID() };
  748. tableModelProperties.addRow(tempConnection);
  749. }
  750. } else {
  751. if (temp.getID() != temp2.getA().getID()) {
  752. Object[] tempConnection = { "",
  753. temp2.getA().getName() + " with ID: " + temp2.getA().getID() };
  754. tableModelProperties.addRow(tempConnection);
  755. } else {
  756. Object[] tempConnection = { "",
  757. temp2.getB().getName() + " with ID: " + temp2.getB().getID() };
  758. tableModelProperties.addRow(tempConnection);
  759. }
  760. }
  761. }
  762. }
  763. } else if (model.getSelectedEdge() != null) {
  764. Object[] tempName = { "Name", "Edge: " + model.getSelectedEdge().getA().getName() + " to "
  765. + model.getSelectedEdge().getB().getName() };
  766. tableModelProperties.addRow(tempName);
  767. Object[] tempFlow = { "Current flow", model.getSelectedEdge().getFlow() };
  768. tableModelProperties.addRow(tempFlow);
  769. Object[] tempCapacity = { "Max. Capacity", model.getSelectedEdge().getCapacity() };
  770. tableModelProperties.addRow(tempCapacity);
  771. tableModelProperties.setCellEditable(0, 1, false);
  772. tableModelProperties.setCellEditable(2, 1, true);
  773. } else if (getActualCps() == null) {
  774. deleteRows();
  775. }
  776. }
  777. });
  778. toolBar.add(btnAdd);
  779. // Del Button
  780. btnDel.addActionListener(new ActionListener() {
  781. public void actionPerformed(ActionEvent arg0) {
  782. Object nodeInfo = tree.getLastSelectedPathComponent();
  783. if (nodeInfo != null) {
  784. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
  785. String nodeName = selectedNode.getUserObject().toString();
  786. int depthOfNode = selectedNode.getLevel();
  787. switch (depthOfNode) {
  788. case 1:
  789. int dialogResult = JOptionPane.showConfirmDialog(null,
  790. "Do you realy want to delete the Category " + nodeName + "?", "Warning",
  791. JOptionPane.YES_NO_OPTION);
  792. if (dialogResult == JOptionPane.YES_OPTION) {
  793. controller.deleteCategory(nodeName);
  794. }
  795. break;
  796. case 2:
  797. DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
  798. controller.delObjectCategory(parent.getUserObject().toString(), nodeName);
  799. break;
  800. default:
  801. JOptionPane.showMessageDialog(new JFrame(),
  802. "Please select a Category or an Object in order to delete something.");
  803. }
  804. } else {
  805. JOptionPane.showMessageDialog(new JFrame(),
  806. "Please select a Category or an Object in order to delete something.");
  807. }
  808. tree.repaint();
  809. }
  810. });
  811. toolBar.add(btnDel);
  812. frmCyberPhysical.getContentPane().add(splitPane);
  813. mntmNew.addActionListener(new ActionListener() {
  814. @Override
  815. public void actionPerformed(ActionEvent arg0) {
  816. model.getEdgesOnCanvas().removeAll(model.getEdgesOnCanvas());
  817. model.getObjectsOnCanvas().removeAll(model.getObjectsOnCanvas());
  818. controller.setSelectedObjectID(0);
  819. controller.setSelecteEdge(null);
  820. controller.setCurIteration(0);
  821. unitGraph.empty();
  822. elementGraph.setText("None ");
  823. canvas.tempCps = null;
  824. canvas.objectSelectionHighlighting();
  825. canvas.repaint();
  826. }
  827. });
  828. mntmOpen.addActionListener(new java.awt.event.ActionListener() {
  829. @Override
  830. public void actionPerformed(java.awt.event.ActionEvent evt) {
  831. menuFileExitActionPerformed(evt);
  832. }
  833. private void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) {
  834. JFileChooser fileChooser = new JFileChooser();
  835. JFrame test = new JFrame();
  836. FileNameExtensionFilter jsonFilter = new FileNameExtensionFilter("*.json", "json");
  837. fileChooser.setFileFilter(jsonFilter);
  838. if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) {
  839. File file = fileChooser.getSelectedFile();
  840. try {
  841. controller.loadFile(file.getAbsolutePath());
  842. canvas.repaint();
  843. ArrayList<HolonElement> tempList = new ArrayList<>();
  844. for (CpsObject cps : model.getObjectsOnCanvas()) {
  845. if (cps instanceof HolonObject) {
  846. for (HolonElement h : ((HolonObject) cps).getElements()) {
  847. tempList.add(h);
  848. unitGraph.repaintWithNewElement(tempList);
  849. unitGraph.fillArrayofValue();
  850. tempList.remove(0);
  851. }
  852. } else if (cps instanceof HolonSwitch) {
  853. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  854. unitGraph.fillArrayofBooleans();
  855. }
  856. }
  857. unitGraph.empty();
  858. tree.repaint();
  859. } catch (IOException e) {
  860. // TODO Auto-generated catch block
  861. e.printStackTrace();
  862. }
  863. }
  864. }
  865. });
  866. mntmSave.addActionListener(new java.awt.event.ActionListener() {
  867. @Override
  868. public void actionPerformed(java.awt.event.ActionEvent evt) {
  869. menuSaveActionPerformed(evt);
  870. }
  871. private void menuSaveActionPerformed(java.awt.event.ActionEvent evt) {
  872. JFileChooser fileChooser = new JFileChooser();
  873. JFrame test = new JFrame();
  874. FileNameExtensionFilter jsonFilter = new FileNameExtensionFilter("*.json", "json");
  875. fileChooser.setFileFilter(jsonFilter);
  876. if (fileChooser.showSaveDialog(test) == JFileChooser.APPROVE_OPTION) {
  877. String file = fileChooser.getSelectedFile().getPath();
  878. if (!file.endsWith(".json"))
  879. file += ".json";
  880. try {
  881. controller.saveFile(new File(file).getAbsolutePath());
  882. } catch (IOException e) {
  883. // TODO Auto-generated catch block
  884. e.printStackTrace();
  885. }
  886. }
  887. }
  888. });
  889. mntmUndo.addActionListener(new java.awt.event.ActionListener() {
  890. @Override
  891. public void actionPerformed(java.awt.event.ActionEvent evt) {
  892. menuUndoActionPerformed(evt);
  893. }
  894. private void menuUndoActionPerformed(java.awt.event.ActionEvent evt) {
  895. try {
  896. controller.loadFile(controller.getUndoSave());
  897. canvas.repaint();
  898. ArrayList<HolonElement> tempList = new ArrayList<>();
  899. for (CpsObject cps : model.getObjectsOnCanvas()) {
  900. if (cps instanceof HolonObject) {
  901. for (HolonElement h : ((HolonObject) cps).getElements()) {
  902. tempList.add(h);
  903. unitGraph.repaintWithNewElement(tempList);
  904. unitGraph.fillArrayofValue();
  905. tempList.remove(0);
  906. }
  907. } else if (cps instanceof HolonSwitch) {
  908. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  909. unitGraph.fillArrayofBooleans();
  910. }
  911. }
  912. unitGraph.empty();
  913. tree.repaint();
  914. } catch (IOException e) {
  915. // TODO Auto-generated catch block
  916. e.printStackTrace();
  917. }
  918. }
  919. });
  920. mntmRedo.addActionListener(new java.awt.event.ActionListener() {
  921. @Override
  922. public void actionPerformed(java.awt.event.ActionEvent evt) {
  923. menuUndoActionPerformed(evt);
  924. }
  925. private void menuUndoActionPerformed(java.awt.event.ActionEvent evt) {
  926. try {
  927. controller.loadFile(controller.getRedoSave());
  928. canvas.repaint();
  929. ArrayList<HolonElement> tempList = new ArrayList<>();
  930. for (CpsObject cps : model.getObjectsOnCanvas()) {
  931. if (cps instanceof HolonObject) {
  932. for (HolonElement h : ((HolonObject) cps).getElements()) {
  933. tempList.add(h);
  934. unitGraph.repaintWithNewElement(tempList);
  935. unitGraph.fillArrayofValue();
  936. tempList.remove(0);
  937. }
  938. } else if (cps instanceof HolonSwitch) {
  939. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  940. unitGraph.fillArrayofBooleans();
  941. }
  942. }
  943. unitGraph.empty();
  944. tree.repaint();
  945. } catch (IOException e) {
  946. // TODO Auto-generated catch block
  947. e.printStackTrace();
  948. }
  949. }
  950. });
  951. timePanel = new TimePanel(model, controller);
  952. timePanel.setBorder(null);
  953. ((JSlider) (timePanel.getComponent(1))).addChangeListener(new ChangeListener() {
  954. @Override
  955. public void stateChanged(ChangeEvent e) {
  956. int i = model.getCurIteration();
  957. controller.calculateStateForTimeStep(i);
  958. unitGraph.repaint();
  959. }
  960. });
  961. splitPane.setRightComponent(splitPane_1);
  962. splitPane.setDividerLocation(200);
  963. splitPane_1.setDividerLocation(500);
  964. splitPane.setLeftComponent(scrollPane_1);
  965. splitPane_1.setLeftComponent(tabbedPane);
  966. splitPane_1.setRightComponent(split_HolonEl_Pro);
  967. split_HolonEl_Pro.setDividerLocation(400);
  968. split_HolonEl_Pro.setTopComponent(split_Graph_HolonEl);
  969. split_HolonEl_Pro.setBottomComponent(scrollProperties);
  970. split_Graph_HolonEl.setDividerLocation(150);
  971. split_Graph_HolonEl.setTopComponent(scrollGraph);
  972. split_Graph_HolonEl.setBottomComponent(scrollElements);
  973. tabbedPane.setBorder(null);
  974. scrollProperties.setBorder(null);
  975. scrollGraph.setBorder(null);
  976. scrollElements.setBorder(null);
  977. splitPane.setBorder(null);
  978. splitPane_1.setBorder(null);
  979. split_HolonEl_Pro.setBorder(null);
  980. split_Graph_HolonEl.setBorder(null);
  981. scrollPane_2.setBorder(null);
  982. panel_HolonEl.setBorder(null);
  983. tableHolonElementScrollPane.setBorder(null);
  984. frmCyberPhysical.getContentPane().add(timePanel, BorderLayout.SOUTH);
  985. }
  986. /*
  987. * adds a specific object type to selected Category also handles input
  988. * windows and illegal inputs
  989. */
  990. public void addObjectAction(String objType, DefaultMutableTreeNode selectedNode) {
  991. if (selectedNode == null) {
  992. JOptionPane.showMessageDialog(new JFrame(),
  993. "Please select a Category first before adding " + objType + ".");
  994. }
  995. // if selected node is a directory for Categories
  996. else {
  997. if (selectedNode.getLevel() == 1) {
  998. String objname = JOptionPane.showInputDialog("Please enter a Name for the " + objType);
  999. Category cat = controller.searchCategory(selectedNode.getUserObject().toString());
  1000. if (objname.length() != 0) {
  1001. switch (objType) {
  1002. case "Switch":
  1003. controller.addSwitch(cat, objname);
  1004. break;
  1005. case "Transformer":
  1006. controller.addTransformer(cat, objname);
  1007. break;
  1008. }
  1009. }
  1010. } else {
  1011. JOptionPane.showMessageDialog(new JFrame(),
  1012. "Objects can not be added to Objects. Please select a Category.");
  1013. }
  1014. }
  1015. }
  1016. /**
  1017. * reloads the Categories from Model
  1018. */
  1019. public void updateCategories(final ArrayList<Category> categories) {
  1020. tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
  1021. {
  1022. DefaultMutableTreeNode node_1;
  1023. for (Category c : categories) {
  1024. node_1 = new DefaultMutableTreeNode(c.getName());
  1025. // kann eventuell umgeändert werden
  1026. for (CpsObject obj : c.getObjects()) {
  1027. node_1.add(new DefaultMutableTreeNode(obj.getObjName()));
  1028. }
  1029. add(node_1);
  1030. }
  1031. }
  1032. }));
  1033. }
  1034. /**
  1035. *
  1036. */
  1037. public void onChange(ArrayList<Category> categories) {
  1038. DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
  1039. updateCategories(categories);
  1040. model.reload();
  1041. }
  1042. /**
  1043. *
  1044. * @return
  1045. */
  1046. public JFrame getFrmCyberPhysical() {
  1047. return frmCyberPhysical;
  1048. }
  1049. /**
  1050. * Getter for selected CpsObject
  1051. *
  1052. * @return selected CpsObject
  1053. */
  1054. public CpsObject getActualCps() {
  1055. int tempID = model.getSelectedObjectID();
  1056. CpsObject tempCps = controller.searchByID(tempID);
  1057. return tempCps;
  1058. }
  1059. /**
  1060. * Search for actual selected HolonElement
  1061. *
  1062. * @param obj
  1063. * selected HolonObject
  1064. * @param yValue
  1065. * Y-Coord in the HolonElementsTable
  1066. * @return the selected HolonElement
  1067. */
  1068. public HolonElement getActualHolonElement(HolonObject obj, int yValue) {
  1069. final int yTemp = (int) Math.floor(yValue / 16);
  1070. int rowsTotal = tableModelHolonElement.getRowCount();
  1071. if (rowsTotal != 0 && rowsTotal > yTemp) {
  1072. model.setSelectedHolonElement(obj.getElements().get(yTemp));
  1073. return obj.getElements().get(yTemp);
  1074. } else {
  1075. model.setSelectedHolonElement(null);
  1076. return null;
  1077. }
  1078. }
  1079. /**
  1080. * Update the HolonElement Table, that means erase all rows and add the new
  1081. * rows with new data
  1082. */
  1083. public void refreshTableHolonElement() {
  1084. // Update of the Information about the HolonElements - only for
  1085. // HolonObjects
  1086. deleteRows();
  1087. if (getActualCps() != null) {
  1088. fillElementTable(((HolonObject) getActualCps()).getElements());
  1089. }
  1090. tableModelHolonElement.fireTableDataChanged();
  1091. }
  1092. /**
  1093. * Erase all information of the HolonElement Model
  1094. */
  1095. public void deleteRows() {
  1096. if (tableModelHolonElement.getRowCount() > 0) {
  1097. for (int i = tableModelHolonElement.getRowCount() - 1; i > -1; i--) {
  1098. tableModelHolonElement.removeRow(i);
  1099. }
  1100. }
  1101. }
  1102. /**
  1103. * Add the Information of the given ArrayList in the HolonElement Model as
  1104. * Name,Energy and Amount
  1105. *
  1106. * @param elements
  1107. * ArrayList to be displayed
  1108. */
  1109. public void fillElementTable(ArrayList<HolonElement> elements) {
  1110. for (HolonElement he : elements) {
  1111. Object[] temp = { he.getEleName(), he.getEnergy(), he.getAmount(), he.getActive() };
  1112. tableModelHolonElement.addRow(temp);
  1113. }
  1114. }
  1115. /**
  1116. * Update the information concerning properties of the selected CpsObject
  1117. */
  1118. public void refreshTableProperties() {
  1119. CpsObject tempCps = getActualCps();
  1120. if (tempCps != null && tempCps.getClass() == HolonObject.class) {
  1121. tableModelProperties.removeRow(2);
  1122. Object[] tempEnergy = { "Total Energy", ((HolonObject) tempCps).getCurrentEnergy() };
  1123. tableModelProperties.insertRow(2, tempEnergy);
  1124. } else if (tempCps instanceof HolonTransformer) {
  1125. // Refresh Transformer Info
  1126. }
  1127. }
  1128. private static void addPopup(Component component, final JPopupMenu popup) {
  1129. component.addMouseListener(new MouseAdapter() {
  1130. public void mousePressed(MouseEvent e) {
  1131. if (e.isPopupTrigger()) {
  1132. showMenu(e);
  1133. }
  1134. }
  1135. public void mouseReleased(MouseEvent e) {
  1136. if (e.isPopupTrigger()) {
  1137. showMenu(e);
  1138. }
  1139. }
  1140. private void showMenu(MouseEvent e) {
  1141. popup.show(e.getComponent(), e.getX(), e.getY());
  1142. }
  1143. });
  1144. }
  1145. }