GUI.java 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744
  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.MouseInfo;
  9. import java.awt.Point;
  10. import java.awt.Toolkit;
  11. import java.awt.event.ActionEvent;
  12. import java.awt.event.ActionListener;
  13. import java.awt.event.KeyEvent;
  14. import java.awt.event.MouseAdapter;
  15. import java.awt.event.MouseEvent;
  16. import java.awt.event.MouseListener;
  17. import java.beans.PropertyChangeEvent;
  18. import java.beans.PropertyChangeListener;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import javax.swing.AbstractAction;
  24. import javax.swing.ActionMap;
  25. import javax.swing.BoxLayout;
  26. import javax.swing.DefaultComboBoxModel;
  27. import javax.swing.ImageIcon;
  28. import javax.swing.InputMap;
  29. import javax.swing.JButton;
  30. import javax.swing.JCheckBoxMenuItem;
  31. import javax.swing.JComboBox;
  32. import javax.swing.JComponent;
  33. import javax.swing.JDialog;
  34. import javax.swing.JEditorPane;
  35. import javax.swing.JFileChooser;
  36. import javax.swing.JFrame;
  37. import javax.swing.JLabel;
  38. import javax.swing.JMenu;
  39. import javax.swing.JMenuBar;
  40. import javax.swing.JMenuItem;
  41. import javax.swing.JOptionPane;
  42. import javax.swing.JPanel;
  43. import javax.swing.JPopupMenu;
  44. import javax.swing.JScrollPane;
  45. import javax.swing.JSlider;
  46. import javax.swing.JSplitPane;
  47. import javax.swing.JTabbedPane;
  48. import javax.swing.JTable;
  49. import javax.swing.JTextField;
  50. import javax.swing.JToolBar;
  51. import javax.swing.JTree;
  52. import javax.swing.KeyStroke;
  53. import javax.swing.SwingUtilities;
  54. import javax.swing.border.LineBorder;
  55. import javax.swing.event.ChangeEvent;
  56. import javax.swing.event.ChangeListener;
  57. import javax.swing.filechooser.FileNameExtensionFilter;
  58. import javax.swing.plaf.FileChooserUI;
  59. import javax.swing.table.DefaultTableModel;
  60. import javax.swing.tree.DefaultMutableTreeNode;
  61. import javax.swing.tree.DefaultTreeModel;
  62. import javax.swing.tree.TreeCellRenderer;
  63. import com.sun.corba.se.spi.orbutil.fsm.Action;
  64. import Interfaces.CategoryListener;
  65. import classes.Category;
  66. import classes.CpsEdge;
  67. import classes.CpsObject;
  68. import classes.HolonElement;
  69. import classes.HolonObject;
  70. import classes.HolonSwitch;
  71. import classes.HolonTransformer;
  72. import classes.Position;
  73. import ui.controller.Control;
  74. import ui.model.Model;
  75. import javax.swing.JList;
  76. import javax.swing.Box;;
  77. public class GUI<E> implements CategoryListener {
  78. private JFrame frmCyberPhysical;
  79. private final SimulationMenu simMenu;
  80. private final JMenuBar menuBar = new JMenuBar();
  81. private final JMenu mnNewMenu = new JMenu("File");
  82. private final JMenu mnNewMenu_1 = new JMenu("Edit");
  83. private final JMenu mnNewMenu_2 = new JMenu("Options");
  84. private final JMenu mnNewMenu_3 = new JMenu("View");
  85. private final JMenu mnHelp = new JMenu("Help");
  86. private final JMenuItem mntmOpen = new JMenuItem("Open");
  87. private final JMenuItem mntmNew = new JMenuItem("New");
  88. private final JMenuItem mntmSave = new JMenuItem("Save");
  89. private final JMenuItem aboutUs = new JMenuItem("About Us");
  90. private final JMenuItem canvasSize = new JMenuItem("View Size");
  91. private final JSplitPane splitPane = new JSplitPane();
  92. private final JSplitPane splitPane_1 = new JSplitPane();
  93. private final JSplitPane splitPane_tree_console = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  94. private final JScrollPane canvasSP = new JScrollPane();
  95. private final JScrollPane scrollPane_1 = new JScrollPane();
  96. private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
  97. private JPopupMenu popmenuEdit = new JPopupMenu();
  98. private JMenuItem editItem = new JMenuItem("Edit Object");
  99. private String catOfObjToBeEdited;
  100. private final JLabel maxGraph = new JLabel("100%");
  101. private final JLabel medGraph = new JLabel("50%");
  102. private final JLabel minGraph = new JLabel("0%");
  103. private final JLabel elementGraph = new JLabel("None ");
  104. private final ArrayList<HolonElement> selectedElements = new ArrayList<HolonElement>();
  105. private String holonEleNamesDisplayed = "None ";
  106. HashMap<Integer, ArrayList<HolonElement>> eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
  107. private final JTree tree = new JTree();
  108. private final JEditorPane dtrpnHereWillBe = new JEditorPane();
  109. /******************************************
  110. ************* Right Container*************
  111. ******************************************/
  112. // Right Container: here comes the information about the HolonObject, such
  113. // as HolonElements Information, Properties and Consumption/Production graph
  114. private final JSplitPane split_HolonEl_Pro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  115. private final JSplitPane split_Graph_HolonEl = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  116. // In this section are all the Holonelements that correspond to the clicked
  117. // HolonObject with consumption/production, name and amount.
  118. // Table for HolonElements --> all cells are editable
  119. private JTable tableHolonElement = new JTable();
  120. // Model for single or multi selection
  121. private PropertyTable tableModelHolonElementMulti = new PropertyTable();
  122. private PropertyTable tableModelHolonElementSingle = new PropertyTable();
  123. private final JPanel scrollElements = new JPanel();
  124. private JScrollPane tableHolonElementScrollPane = new JScrollPane();
  125. // In this section are all the properties that correspond to the clicked
  126. // HolonObject, such as connections, name, Type, etc.
  127. // Table for Properties --> Cell with (0,1) is editable by CpsObjt and
  128. // Cell(3,1) is editable by Edges
  129. private JTable tableProperties = new JTable();
  130. private JPanel graphLabel = new JPanel();
  131. private DefaulTable tableModelProperties;
  132. private final JScrollPane scrollProperties = new JScrollPane();
  133. // In this section is the graph for the selected HolonElement of the clicked
  134. // HolonObject
  135. private JTable tableGraph = new JTable();
  136. private DefaultTableModel tableModelGraph = new DefaultTableModel();
  137. private final JScrollPane scrollGraph = new JScrollPane();
  138. private Model model;
  139. private final Control controller;
  140. // Pop up Windows
  141. private AddObjectPopUp addObjectPopUP;
  142. private AboutUsPopUp aboutUsPopUp;
  143. private AddElementPopUp addElementPopUp;
  144. private final JPanel panel = new JPanel();
  145. private final JPanel panel_HolonEl = new JPanel();
  146. private final JComboBox comboBox = new JComboBox();
  147. // private final JComboBox comboBoxGraph = new JComboBox();
  148. // Buttons
  149. private final JButton btnAdd = new JButton("+");
  150. private final JButton btnDel = new JButton("-");
  151. private final JButton btnAddHolEL = new JButton("+");
  152. private final JButton btnDelHolEL = new JButton("-");
  153. private final JButton resetGraphBtn = new JButton("Reset");
  154. private final JToolBar toolBar = new JToolBar();
  155. private final JToolBar toolBarHolonEl = new JToolBar();
  156. private final JToolBar toolBarGraph = new JToolBar();
  157. // variables
  158. private boolean dragging = false;
  159. private String actualObjectClicked;
  160. private Image img = null;
  161. private CpsObject tempCps = null;
  162. private int yValueElements = 0;
  163. private Console console = new Console();
  164. private MyCanvas canvas;
  165. private UnitGraph unitGraph;
  166. private final JSplitPane splitPane_3 = new JSplitPane();
  167. private final JSlider sizeSlider = new JSlider();
  168. private final JLabel lblImageSize = new JLabel("Image Size");
  169. // Time Stuff
  170. private TimePanel timePanel;
  171. private final JMenu mnAlgorithm = new JMenu("Algorithm");
  172. private final JCheckBoxMenuItem chckbxmntmUseAlgorithm = new JCheckBoxMenuItem("Use Algorithm");
  173. private final JComboBox comboBoxAlgo = new JComboBox();
  174. // Coord for all Cells with text
  175. private int yTHIS;
  176. private int xTHIS;
  177. // Coord for all Cells with boolean values (checkbox)
  178. private int yBTHIS;
  179. private int xBTHIS;
  180. private CpsObject temp = null;
  181. private final JButton btnTest = new JButton("test");
  182. private final JMenuItem mntmUndo = new JMenuItem("Undo");
  183. private final JMenuItem mntmRedo = new JMenuItem("Redo");
  184. private final JMenuItem mntmEditEdges = new JMenuItem("Edit Edges");
  185. private final JMenuItem mntmFindReplace = new JMenuItem("Find/ Replace");
  186. private final JMenuItem mntmEditShowedInformation = new JMenuItem("Edit showed Information");
  187. private final JMenuItem mntmResetCategory = new JMenuItem("Reset Categories");
  188. private final JMenuItem mntmSetFolder = new JMenuItem("Set Folder");
  189. private final JMenu mnSimulationSpeed = new JMenu("Simulation Speed");
  190. private final JTextField simulationSpeedField = new JTextField();
  191. private final JButton btnApply = new JButton("Apply");
  192. /**
  193. * Create the application.
  194. */
  195. public GUI(Control control) {
  196. this.controller = control;
  197. this.model = control.getModel();
  198. this.canvas = new MyCanvas(model, control);
  199. this.unitGraph = new UnitGraph(model, control);
  200. control.initListener(this);
  201. controller.setCanvas(canvas);
  202. model.setConsole(console);
  203. simMenu = new SimulationMenu(model, control);
  204. initialize();
  205. updateCategories(model.getCategories());
  206. }
  207. /**
  208. * Initialize the contents of the frame.
  209. */
  210. @SuppressWarnings({ "serial", "unchecked" })
  211. private void initialize() {
  212. simulationSpeedField.setColumns(10);
  213. frmCyberPhysical = new JFrame();
  214. frmCyberPhysical.setTitle("Cyber Physical Systems Model");
  215. frmCyberPhysical.setBounds(100, 100, 1000, 800);
  216. frmCyberPhysical.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  217. frmCyberPhysical.addWindowListener(new java.awt.event.WindowAdapter() {
  218. @Override
  219. public void windowClosing(java.awt.event.WindowEvent windowEvent) {
  220. if (JOptionPane.showConfirmDialog(frmCyberPhysical, "Are you sure you want to exit?",
  221. "Cyber Physical Systems Model", JOptionPane.YES_NO_OPTION,
  222. JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
  223. deleteDirectory(new File(System.getProperty("user.home") + "/HolonGUI/Autosave"));
  224. System.exit(0);
  225. }
  226. }
  227. private void deleteDirectory(File path) {
  228. if (path.exists()) {
  229. File[] files = path.listFiles();
  230. for (int i = 0; i < files.length; i++) {
  231. if (files[i].isDirectory()) {
  232. deleteDirectory(files[i]);
  233. } else {
  234. files[i].delete();
  235. }
  236. }
  237. path.delete();
  238. }
  239. }
  240. });
  241. JPanel contentPane = (JPanel) frmCyberPhysical.getContentPane();
  242. int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
  243. InputMap inputMap = contentPane.getInputMap(condition);
  244. ActionMap actionMap = contentPane.getActionMap();
  245. String cntrlZDown = "controlZ";
  246. inputMap.put(KeyStroke.getKeyStroke("control Z"), cntrlZDown);
  247. actionMap.put(cntrlZDown, new AbstractAction() {
  248. @Override
  249. public void actionPerformed(ActionEvent e) {
  250. try {
  251. controller.loadFile(controller.getUndoSave());
  252. canvas.repaint();
  253. ArrayList<HolonElement> tempList = new ArrayList<>();
  254. for (CpsObject cps : model.getObjectsOnCanvas()) {
  255. if (cps instanceof HolonObject) {
  256. for (HolonElement h : ((HolonObject) cps).getElements()) {
  257. tempList.add(h);
  258. unitGraph.repaintWithNewElement(tempList);
  259. unitGraph.fillArrayofValue();
  260. tempList.remove(0);
  261. }
  262. } else if (cps instanceof HolonSwitch) {
  263. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  264. unitGraph.fillArrayofBooleans();
  265. }
  266. }
  267. unitGraph.empty();
  268. controller.addTextToConsole("undo", Color.BLACK, 12, false, false, true);
  269. } catch (IOException f) {
  270. // TODO Auto-generated catch block
  271. f.printStackTrace();
  272. }
  273. }
  274. });
  275. String cntrlYDown = "controlY";
  276. inputMap.put(KeyStroke.getKeyStroke("control Y"), cntrlYDown);
  277. actionMap.put(cntrlYDown, new AbstractAction() {
  278. @Override
  279. public void actionPerformed(ActionEvent e) {
  280. try {
  281. controller.loadFile(controller.getRedoSave());
  282. canvas.repaint();
  283. ArrayList<HolonElement> tempList = new ArrayList<>();
  284. for (CpsObject cps : model.getObjectsOnCanvas()) {
  285. if (cps instanceof HolonObject) {
  286. for (HolonElement h : ((HolonObject) cps).getElements()) {
  287. tempList.add(h);
  288. unitGraph.repaintWithNewElement(tempList);
  289. unitGraph.fillArrayofValue();
  290. tempList.remove(0);
  291. }
  292. } else if (cps instanceof HolonSwitch) {
  293. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  294. unitGraph.fillArrayofBooleans();
  295. }
  296. }
  297. unitGraph.empty();
  298. controller.addTextToConsole("redo", Color.BLACK, 12, false, false, true);
  299. } catch (IOException f) {
  300. // TODO Auto-generated catch block
  301. f.printStackTrace();
  302. }
  303. }
  304. });
  305. String cntrlADown = "controlA";
  306. inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
  307. actionMap.put(cntrlADown, new AbstractAction() {
  308. @Override
  309. public void actionPerformed(ActionEvent e) {
  310. model.getSelectedCpsObjects().clear();
  311. for (CpsObject cps: model.getObjectsOnCanvas()) {
  312. controller.addSelectedObject(cps);
  313. }
  314. canvas.repaint();
  315. }
  316. });
  317. String delDown = "delete";
  318. inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), delDown);
  319. actionMap.put(delDown, new AbstractAction() {
  320. @Override
  321. public void actionPerformed(ActionEvent e) {
  322. for (CpsObject cps : model.getSelectedCpsObjects()) {
  323. controller.delCanvasObject(cps);
  324. }
  325. model.getSelectedCpsObjects().clear();
  326. /*
  327. * controller.setSelectedObjectID(0); for (int i =
  328. * tableModelHolonElementMulti.getRowCount() - 1; i > -1; i--) {
  329. * tableModelHolonElementMulti.removeRow(i); } for (int i =
  330. * tableModelHolonElementSingle.getRowCount() - 1; i > -1; i--)
  331. * { tableModelHolonElementSingle.removeRow(i); } for (int i =
  332. * tableModelProperties.getRowCount() - 1; i > -1; i--) {
  333. * tableModelProperties.removeRow(i); }
  334. */
  335. canvas.repaint();
  336. unitGraph.empty();
  337. }
  338. });
  339. String cntrlCDown = "controlC";
  340. inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
  341. actionMap.put(cntrlCDown, new AbstractAction() {
  342. @Override
  343. public void actionPerformed(ActionEvent e) {
  344. if (!model.getSelectedCpsObjects().isEmpty()) {
  345. controller.copyObjects();
  346. if (!model.getClipboradObjects().isEmpty()) {
  347. canvas.itemPaste.setEnabled(true);
  348. }
  349. }
  350. }
  351. });
  352. String cntrlVDown = "controlV";
  353. inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
  354. actionMap.put(cntrlVDown, new AbstractAction() {
  355. @Override
  356. public void actionPerformed(ActionEvent e) {
  357. controller.pasteObjects(canvas.getMousePosition());
  358. canvas.repaint();
  359. }
  360. });
  361. String cntrlXDown = "controlX";
  362. inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
  363. actionMap.put(cntrlXDown, new AbstractAction() {
  364. @Override
  365. public void actionPerformed(ActionEvent e) {
  366. if (!model.getSelectedCpsObjects().isEmpty()) {
  367. controller.cutObjects();
  368. if (!model.getClipboradObjects().isEmpty()) {
  369. canvas.itemPaste.setEnabled(true);
  370. }
  371. canvas.repaint();
  372. }
  373. }
  374. });
  375. frmCyberPhysical.setJMenuBar(menuBar);
  376. frmCyberPhysical.setIconImage(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage()
  377. .getScaledInstance(30, 30, Image.SCALE_SMOOTH));
  378. menuBar.add(mnNewMenu);
  379. mnNewMenu.add(mntmNew);
  380. mnNewMenu.add(mntmOpen);
  381. mnNewMenu.add(mntmSave);
  382. menuBar.add(mnNewMenu_1);
  383. mnNewMenu_1.add(mntmUndo);
  384. mnNewMenu_1.add(mntmRedo);
  385. mntmFindReplace.addActionListener(new ActionListener() {
  386. public void actionPerformed(ActionEvent e) {
  387. try {
  388. searchPopUp dialog = new searchPopUp(controller, canvas);
  389. dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  390. dialog.setVisible(true);
  391. } catch (Exception e1) {
  392. e1.printStackTrace();
  393. }
  394. }
  395. });
  396. mnNewMenu_1.add(mntmFindReplace);
  397. mntmEditShowedInformation.addActionListener(new ActionListener() {
  398. public void actionPerformed(ActionEvent e) {
  399. try {
  400. ShowedInformationPopUp dialog = new ShowedInformationPopUp(canvas);
  401. dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  402. dialog.setVisible(true);
  403. } catch (Exception e1) {
  404. e1.printStackTrace();
  405. }
  406. }
  407. });
  408. mnNewMenu_1.add(mntmEditShowedInformation);
  409. menuBar.add(mnNewMenu_2);
  410. mntmEditEdges.addActionListener(new ActionListener() {
  411. public void actionPerformed(ActionEvent e) {
  412. EditEdgesPopUp edgePopUp = new EditEdgesPopUp();
  413. edgePopUp.setCanvas(canvas);
  414. edgePopUp.setController(controller);
  415. edgePopUp.setVisible(true);
  416. }
  417. });
  418. mnNewMenu_2.add(mntmEditEdges);
  419. mnNewMenu_2.add(mntmResetCategory);
  420. mnNewMenu_2.add(mnSimulationSpeed);
  421. mnSimulationSpeed.add(simulationSpeedField);
  422. mntmResetCategory.addActionListener(new ActionListener() {
  423. @Override
  424. public void actionPerformed(ActionEvent e) {
  425. ArrayList<Category> cat = model.getCategories();
  426. while (!cat.isEmpty()) {
  427. controller.deleteCategory(cat.get(0).getName());
  428. ;
  429. }
  430. controller.resetCategorys();
  431. tree.repaint();
  432. }
  433. });
  434. menuBar.add(mnNewMenu_3);
  435. mnNewMenu_3.add(canvasSize);
  436. canvasSize.addActionListener(new ActionListener() {
  437. @Override
  438. public void actionPerformed(ActionEvent e) {
  439. JPanel myPanel = new JPanel();
  440. JTextField field1 = new JTextField("" + canvas.getWidth() + "");
  441. JTextField field2 = new JTextField("" + canvas.getHeight() + "");
  442. myPanel.add(field1);
  443. myPanel.add(field2);
  444. JOptionPane.showMessageDialog(null, myPanel);
  445. canvas.setPreferredSize(
  446. new Dimension(Integer.parseInt(field1.getText()), Integer.parseInt(field2.getText())));
  447. canvas.repaint();
  448. }
  449. });
  450. mnNewMenu_3.add(splitPane_3);
  451. sizeSlider.setMinimum(15);
  452. sizeSlider.setMaximum(115);
  453. sizeSlider.addChangeListener(new ChangeListener() {
  454. @Override
  455. public void stateChanged(ChangeEvent e) {
  456. controller.setScale(sizeSlider.getValue());
  457. tree.setRowHeight(model.getScale());
  458. canvas.objectSelectionHighlighting();
  459. canvas.repaint();
  460. }
  461. });
  462. splitPane_3.setRightComponent(sizeSlider);
  463. splitPane_3.setLeftComponent(lblImageSize);
  464. menuBar.add(mnHelp);
  465. mnHelp.add(aboutUs);
  466. menuBar.add(mnAlgorithm);
  467. mnAlgorithm.add(mntmSetFolder);
  468. mnAlgorithm.add(chckbxmntmUseAlgorithm);
  469. canvas.setBackground(Color.WHITE);
  470. canvas.setPreferredSize(new Dimension(1000, 1000));
  471. /********************
  472. * RIGHT CONTAINER (INFORMATION)
  473. **********************/
  474. // Set up of the HolonElements section
  475. // Two different Models: Multi for multi-selection mode and Single for
  476. // single-selection mode (CPS-Object)
  477. Object[] columnNamesMulti = { "Object", "Nr.", "Device", "Energy", "Quantity", "Activated" };
  478. tableModelHolonElementMulti.setColumnIdentifiers(columnNamesMulti);
  479. Object[] columnNamesSingle = { "Nr.", "Device", "Energy", "Quantity", "Activated" };
  480. tableModelHolonElementSingle.setColumnIdentifiers(columnNamesSingle);
  481. tableHolonElement.setBorder(null);
  482. tableHolonElement.setFillsViewportHeight(true);
  483. tableHolonElement.setCellSelectionEnabled(true);
  484. tableHolonElement.setColumnSelectionAllowed(true);
  485. tableHolonElementScrollPane.setViewportView(tableHolonElement);
  486. scrollElements.setLayout(new BorderLayout(0, 0));
  487. scrollElements.add(panel_HolonEl, BorderLayout.NORTH);
  488. scrollElements.add(tableHolonElementScrollPane);
  489. panel_HolonEl.setLayout(new BoxLayout(panel_HolonEl, BoxLayout.X_AXIS));
  490. toolBarHolonEl.add(btnAddHolEL);
  491. toolBarHolonEl.add(btnDelHolEL);
  492. toolBarHolonEl.setFloatable(false);
  493. panel_HolonEl.add(toolBarHolonEl);
  494. // Set up of the Properties section
  495. Object[] colNames = { "Field", "Information" };
  496. tableModelProperties = new DefaulTable(1000, colNames.length);
  497. tableModelProperties.setColumnIdentifiers(colNames);
  498. tableProperties.setModel(tableModelProperties);
  499. tableProperties.setFillsViewportHeight(true);
  500. tableProperties.setCellSelectionEnabled(true);
  501. tableProperties.setColumnSelectionAllowed(true);
  502. scrollProperties.setViewportView(tableProperties);
  503. // Set up of the Graph section
  504. tableGraph.setModel(tableModelGraph);
  505. tableGraph.setFillsViewportHeight(true);
  506. tableGraph.setCellSelectionEnabled(true);
  507. tableGraph.setColumnSelectionAllowed(true);
  508. scrollGraph.setViewportView(unitGraph);
  509. graphLabel.setLayout(new BorderLayout(0, 10));
  510. graphLabel.add(maxGraph, BorderLayout.NORTH);
  511. graphLabel.add(medGraph, BorderLayout.CENTER);
  512. graphLabel.add(minGraph, BorderLayout.SOUTH);
  513. toolBarGraph.add(elementGraph);
  514. toolBarGraph.add(resetGraphBtn);
  515. toolBarGraph.setFloatable(false);
  516. scrollGraph.setRowHeaderView(graphLabel);
  517. scrollGraph.setColumnHeaderView(toolBarGraph);
  518. /***********************
  519. * HolonElement Table Actions
  520. **********************/
  521. /*
  522. * Add HolonElement to given HolonObject
  523. */
  524. btnAddHolEL.addActionListener(new ActionListener() {
  525. public void actionPerformed(ActionEvent arg0) {
  526. if (model.getSelectedCpsObjects().size() == 1) {
  527. CpsObject tempCpsObject = getActualCps();
  528. if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
  529. && tempCpsObject.getID() != 0) {
  530. addElementPopUp = new AddElementPopUp();
  531. addElementPopUp.setActualCps(getActualCps());
  532. addElementPopUp.setVisible(true);
  533. HolonElement ele = addElementPopUp.getElement();
  534. controller.addElementCanvasObject(tempCpsObject.getID(), ele.getEleName(), ele.getAmount(),
  535. ele.getEnergy());
  536. refreshTableHolonElement();
  537. refreshTableProperties();
  538. controller.calculateStateForTimeStep(model.getCurIteration());
  539. }
  540. }
  541. }
  542. });
  543. /*
  544. * Delete the chosen HolonElement of the selected HolonObject,
  545. * Multi-Selection for CpsObjects as well as for HolonElements possible
  546. */
  547. btnDelHolEL.addActionListener(new ActionListener() {
  548. public void actionPerformed(ActionEvent arg0) {
  549. // For Single Selection of CpsObject
  550. if (model.getSelectedCpsObjects().size() == 1) {
  551. if (getActualCps().getClass() == HolonObject.class) {
  552. HolonObject obj = (HolonObject) getActualCps();
  553. for (HolonElement e : selectedElements) {
  554. controller.deleteElementCanvas(obj.getID(), e.getId());
  555. refreshTableHolonElement();
  556. refreshTableProperties();
  557. controller.calculateStateForTimeStep(model.getCurIteration());
  558. // Names displayed in graph are not updated
  559. }
  560. selectedElements.clear();
  561. }
  562. // For MultiSelection of CpsObject
  563. } else if (model.getSelectedCpsObjects().size() > 1) {
  564. for (Integer i : eleToDelete.keySet()) {
  565. for (HolonElement e : eleToDelete.get(i)) {
  566. controller.deleteElementCanvas(i, e.getId());
  567. }
  568. }
  569. refreshTableHolonElement();
  570. refreshTableProperties();
  571. }
  572. }
  573. });
  574. /*
  575. * Communication between HolonElement Table and displayed Graph and
  576. * Properties, as well as selection of differet HolonElements
  577. */
  578. tableHolonElement.addMouseListener(new MouseAdapter() {
  579. public void mousePressed(MouseEvent e) {
  580. HolonObject obj = (HolonObject) getActualCps();
  581. yValueElements = e.getY();
  582. HolonElement ele = null;
  583. // Search for current clicked HolonElement
  584. if (model.getSelectedCpsObjects().size() == 1) {
  585. ele = getActualHolonElement(obj, yValueElements, 0);
  586. } else {
  587. ele = getActualHolonElement(null, yValueElements, 0);
  588. }
  589. // Multi-Selection of HolonElements through control button +
  590. // mouse click
  591. if (e.isControlDown() && ele != null) {
  592. if (!selectedElements.contains(ele)) {
  593. selectedElements.add(ele);
  594. if (!holonEleNamesDisplayed.equals("None ")) {
  595. holonEleNamesDisplayed = holonEleNamesDisplayed + "; " + ele.getEleName() + " ";
  596. } else {
  597. holonEleNamesDisplayed = ele.getEleName() + " ";
  598. }
  599. unitGraph.repaintWithNewElement(selectedElements);
  600. }
  601. getActualHolonElement(null, yValueElements, 2);
  602. } // if no control-button pressed but a HolonElement choose
  603. else if (ele != null) {
  604. selectedElements.clear();
  605. selectedElements.add(ele);
  606. getActualHolonElement(null, yValueElements, 1);
  607. holonEleNamesDisplayed = ele.getEleName() + " ";
  608. unitGraph.repaintWithNewElement(selectedElements);
  609. } // If any empty space is clicked
  610. else {
  611. elementGraph.setText("None ");
  612. unitGraph.empty();
  613. }
  614. // if any HolonElement is double-clicked --> Edit-Mode started
  615. // for selected HolonElement
  616. if (e.getClickCount() == 2) {
  617. yTHIS = e.getY();
  618. xTHIS = e.getX();
  619. }
  620. // for single click and empty slot
  621. if (e.getClickCount() == 1 && ele == null) {
  622. selectedElements.clear();
  623. holonEleNamesDisplayed = "None ";
  624. }
  625. elementGraph.setText(holonEleNamesDisplayed);
  626. yBTHIS = e.getY();
  627. xBTHIS = e.getX();
  628. }
  629. });
  630. /*
  631. * Triggered every time a change is made
  632. */
  633. tableHolonElement.addPropertyChangeListener(new PropertyChangeListener() {
  634. @Override
  635. public void propertyChange(PropertyChangeEvent evt) {
  636. try {
  637. int yMouse = yTHIS;
  638. int yBMouse = yBTHIS;
  639. int selectedValueY = (int) Math.floor(yMouse / 16);
  640. int selectedValueBY = (int) Math.floor(yBMouse / 16);
  641. // for multi-selection mode
  642. if (model.getSelectedCpsObjects().size() > 1) {
  643. int selectedValueX = (int) Math.floor(xTHIS / (tableHolonElement.getWidth() / 6));
  644. int selectedValueBX = (int) Math.floor(xBTHIS / (tableHolonElement.getWidth() / 6));
  645. if (getHolonObj(yMouse) != null) {
  646. // For last column (boolean with a checkbox)
  647. if (selectedValueBX == 5) {
  648. HolonElement eleBTemp = getActualHolonElement(null, yBMouse, 0);
  649. String newBStuff = tableModelHolonElementMulti
  650. .getValueAt(selectedValueBY, selectedValueBX).toString();
  651. Boolean bTemp = Boolean.parseBoolean(newBStuff);
  652. eleBTemp.setActive(bTemp);
  653. } else {
  654. // Update of HolonElement
  655. HolonElement eleTemp = getActualHolonElement(null, yMouse, 0);
  656. String newStuff = tableModelHolonElementMulti.getValueAt(selectedValueY, selectedValueX)
  657. .toString();
  658. // Name update
  659. if (selectedValueX == 2) {
  660. eleTemp.setEleName(newStuff);
  661. }
  662. // Energy Update
  663. else if (selectedValueX == 3) {
  664. Float ftemp = Float.parseFloat(newStuff);
  665. eleTemp.setEnergy(ftemp);
  666. }
  667. // Amount of Elements update
  668. else if (selectedValueX == 4) {
  669. Integer iTemp = Integer.parseInt(newStuff);
  670. eleTemp.setAmount(iTemp);
  671. }
  672. }
  673. }
  674. } // For single-selection mode
  675. else if (model.getSelectedCpsObjects().size() == 1) {
  676. int selectedValueX = (int) Math.floor(xTHIS / (tableHolonElement.getWidth() / 5));
  677. int selectedValueBX = (int) Math.floor(xBTHIS / (tableHolonElement.getWidth() / 5));
  678. if (getActualCps() != null && getActualCps().getClass() == HolonObject.class) {
  679. // For last column (boolean with a checkbox)
  680. if (selectedValueBX == 4) {
  681. HolonElement eleBTemp = getActualHolonElement((HolonObject) getActualCps(), yBMouse, 0);
  682. String newBStuff = tableModelHolonElementSingle
  683. .getValueAt(selectedValueBY, selectedValueBX).toString();
  684. Boolean bTemp = Boolean.parseBoolean(newBStuff);
  685. eleBTemp.setActive(bTemp);
  686. } else {
  687. // Update of HolonElement
  688. HolonElement eleTemp = getActualHolonElement((HolonObject) getActualCps(), yMouse, 0);
  689. String newStuff = tableModelHolonElementSingle
  690. .getValueAt(selectedValueY, selectedValueX).toString();
  691. // Name update
  692. if (selectedValueX == 1) {
  693. eleTemp.setEleName(newStuff);
  694. } // Energy Update
  695. else if (selectedValueX == 2) {
  696. Float ftemp = Float.parseFloat(newStuff);
  697. eleTemp.setEnergy(ftemp);
  698. } // Amount of Elements update
  699. else if (selectedValueX == 3) {
  700. Integer iTemp = Integer.parseInt(newStuff);
  701. eleTemp.setAmount(iTemp);
  702. }
  703. }
  704. refreshTableProperties();
  705. tableModelHolonElementSingle.fireTableDataChanged();
  706. controller.calculateStateForTimeStep(model.getCurIteration());
  707. unitGraph.repaint();
  708. }
  709. }
  710. } catch (Exception e) {
  711. }
  712. }
  713. });
  714. /***********************
  715. * HolonElement Properties Actions
  716. **********************/
  717. /*
  718. * Update any change in the Property table
  719. */
  720. tableProperties.addPropertyChangeListener(new PropertyChangeListener() {
  721. @Override
  722. public void propertyChange(PropertyChangeEvent evt) {
  723. try {
  724. Object temp;
  725. if (getActualCps() != null) {
  726. if (getActualCps() instanceof HolonObject) {
  727. temp = tableModelProperties.getValueAt(0, 1);
  728. getActualCps().setName(temp.toString());
  729. }
  730. } else {
  731. Point mousePos = tableProperties.getMousePosition();
  732. temp = tableModelProperties.getValueAt(mousePos.y / tableProperties.getRowHeight(),
  733. mousePos.x / (tableProperties.getWidth() / 2));
  734. if (mousePos.y / tableProperties.getRowHeight() == 2) {
  735. Float ftemp;
  736. if (Float.parseFloat(temp.toString()) >= 0.0) {
  737. ftemp = Float.parseFloat(temp.toString());
  738. } else {
  739. ftemp = model.getSelectedEdge().getCapacity();
  740. }
  741. model.getSelectedEdge().setCapacity(ftemp);
  742. } else if (mousePos.y / tableProperties.getRowHeight() == 3) {
  743. Boolean bTemp = Boolean.parseBoolean(temp.toString());
  744. model.getSelectedEdge().setState(bTemp);
  745. }
  746. }
  747. canvas.repaint();
  748. } catch (Exception e) {
  749. }
  750. }
  751. });
  752. /***********************
  753. * HolonElement Graph Actions
  754. **********************/
  755. /*
  756. * Reset the graph of the selected HolonElement
  757. */
  758. resetGraphBtn.setBorder(new LineBorder(Color.BLACK));
  759. resetGraphBtn.addActionListener(new ActionListener() {
  760. public void actionPerformed(ActionEvent arg0) {
  761. unitGraph.reset();
  762. }
  763. });
  764. /*****************************
  765. * RIGHT CONTAINER DONE
  766. *****************************/
  767. frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0));
  768. TreeCellRenderer customRenderer = new TreeCellRenderer() {
  769. @Override
  770. public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
  771. boolean leaf, int row, boolean hasFocus) {
  772. JLabel label = new JLabel();
  773. Image imgR = null;
  774. if (leaf) {
  775. for (Category cat : model.getCategories()) {
  776. for (CpsObject cps : cat.getObjects()) {
  777. if (value.toString().compareTo(cps.getObjName()) == 0) {
  778. File checkPath = new File(cps.getImage());
  779. if (checkPath.exists()) {
  780. imgR = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
  781. controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH);
  782. } else {
  783. imgR = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
  784. .getScaledInstance(controller.getScale(), controller.getScale(),
  785. java.awt.Image.SCALE_SMOOTH);
  786. }
  787. if (imgR != null) {
  788. label.setIcon(new ImageIcon(imgR));
  789. }
  790. label.setText(cps.getName());
  791. }
  792. }
  793. }
  794. }
  795. tree.setRowHeight(model.getScale());
  796. if (hasFocus) {
  797. label.setForeground(new Color(0, 0, 255));
  798. label.setOpaque(true);
  799. }
  800. if (label.getText().length() == 0) {
  801. label.setText(value.toString());
  802. if (value.toString().compareTo("Categories") != 0) {
  803. label.setIcon(new ImageIcon(this.getClass().getResource("/Images/folder.png")));
  804. }
  805. }
  806. return label;
  807. }
  808. };
  809. tree.setCellRenderer(customRenderer);
  810. tree.addMouseListener(new MouseAdapter() {
  811. public void mouseReleased(MouseEvent e) {
  812. try {
  813. if (dragging) {
  814. int x = (int) canvas.getMousePosition().getX();
  815. int y = (int) canvas.getMousePosition().getY();
  816. CpsObject h = null;
  817. if (tempCps.getClass() == HolonObject.class) {
  818. h = new HolonObject(tempCps);
  819. }
  820. if (tempCps.getClass() == HolonSwitch.class) {
  821. h = new HolonSwitch(tempCps);
  822. }
  823. if (tempCps.getClass() == HolonTransformer.class) {
  824. h = new HolonTransformer(tempCps);
  825. }
  826. h.setPosition(x, y);
  827. controller.addObjectCanvas(h);
  828. canvas.repaint();
  829. dragging = false;
  830. }
  831. } catch (Exception e2) {
  832. }
  833. frmCyberPhysical.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
  834. }
  835. });
  836. popmenuEdit.add(editItem);
  837. editItem.setEnabled(false);
  838. editItem.addActionListener(new ActionListener() {
  839. @Override
  840. public void actionPerformed(ActionEvent e) {
  841. }
  842. });
  843. tree.addMouseListener(new MouseAdapter() {
  844. public void mousePressed(MouseEvent e) {
  845. try {
  846. actualObjectClicked = tree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent().toString();
  847. // if an Object was selected, the porperties are shown in
  848. // the table
  849. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
  850. .getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
  851. if (selectedNode.getLevel() == 2) {
  852. CpsObject selected = controller.searchCategoryObject(selectedNode.getParent().toString(),
  853. selectedNode.toString());
  854. deleteRows(tableModelHolonElementSingle);
  855. deleteRows(tableModelHolonElementMulti);
  856. // if (selected instanceof HolonObject && selected !=
  857. // null) {
  858. // selected = (HolonObject) selected;
  859. // fillElementTable(((HolonObject)
  860. // selected).getElements());
  861. // }
  862. }
  863. if (SwingUtilities.isRightMouseButton(e)) {
  864. for (Category cat : model.getCategories()) {
  865. for (CpsObject cps : cat.getObjects()) {
  866. if (actualObjectClicked.compareTo(cps.getObjName()) == 0
  867. && !(cps instanceof HolonSwitch)) {
  868. editItem.setEnabled(true);
  869. popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
  870. catOfObjToBeEdited = selectedNode.getParent().toString();
  871. tempCps = cps;
  872. }
  873. }
  874. }
  875. } else {
  876. for (Category cat : model.getCategories()) {
  877. for (CpsObject cps : cat.getObjects()) {
  878. if (actualObjectClicked.compareTo(cps.getObjName()) == 0) {
  879. File checkPath = new File(cps.getImage());
  880. if (checkPath.exists()) {
  881. img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
  882. controller.getScale(), controller.getScale(),
  883. java.awt.Image.SCALE_SMOOTH);
  884. } else {
  885. img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
  886. .getScaledInstance(controller.getScale(), controller.getScale(),
  887. java.awt.Image.SCALE_SMOOTH);
  888. }
  889. tempCps = cps;
  890. dragging = true;
  891. Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0),
  892. "Image");
  893. frmCyberPhysical.setCursor(cursor);
  894. }
  895. }
  896. }
  897. }
  898. } catch (Exception e2) {
  899. }
  900. }
  901. });
  902. editItem.addActionListener(new ActionListener() {
  903. @Override
  904. public void actionPerformed(ActionEvent e) {
  905. // Remove the selected Object object
  906. addObjectPopUP = new AddObjectPopUp(true, tempCps, catOfObjToBeEdited);
  907. addObjectPopUP.setCategory(catOfObjToBeEdited);
  908. addObjectPopUP.setController(controller);
  909. addObjectPopUP.setVisible(true);
  910. }
  911. });
  912. scrollPane_1.setViewportView(tree);
  913. scrollPane_1.setColumnHeaderView(panel);
  914. panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
  915. toolBar.setFloatable(false);
  916. panel.add(toolBar);
  917. toolBar.add(comboBox);
  918. comboBox.setModel(new DefaultComboBoxModel(new String[] { "Category", "Object", "Transformer", "Switch" }));
  919. // Add Button
  920. btnAdd.addActionListener(new ActionListener() {
  921. public void actionPerformed(ActionEvent arg0) {
  922. Object nodeInfo = tree.getLastSelectedPathComponent();
  923. String selectedOption = comboBox.getSelectedItem().toString();
  924. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
  925. switch (selectedOption) {
  926. case "Category":
  927. String catName = JOptionPane.showInputDialog("Please enter a Name for Category ");
  928. if (catName.length() != 0) {
  929. controller.addCategory(catName);
  930. }
  931. break;
  932. case "Object":
  933. if (selectedNode == null) {
  934. JOptionPane.showMessageDialog(new JFrame(),
  935. "Please select a Category first before adding " + selectedOption + ".");
  936. }
  937. if (selectedNode.getLevel() == 1) {
  938. CpsObject tmp = new HolonObject("");
  939. addObjectPopUP = new AddObjectPopUp(false, tmp, null);
  940. addObjectPopUP.setVisible(true);
  941. addObjectPopUP.setController(controller);
  942. addObjectPopUP.setCategory(selectedNode.toString());
  943. }
  944. break;
  945. default:
  946. addObjectAction(selectedOption, selectedNode);
  947. break;
  948. }
  949. tree.repaint();
  950. }
  951. });
  952. /**
  953. * Pop up - About Us with some important information about the
  954. * developers, source and programming stuff
  955. */
  956. aboutUs.addMouseListener(new MouseAdapter() {
  957. @Override
  958. public void mousePressed(MouseEvent e) {
  959. aboutUsPopUp = new AboutUsPopUp();
  960. aboutUsPopUp.setVisible(true);
  961. }
  962. });
  963. /**
  964. * Update of every interaction between the user and the canvas (only on
  965. * the canvas). Basically the update of all the information concerning
  966. * the clicked HolonObject. For multi-selection, the propertyTable would
  967. * be disabled
  968. */
  969. canvas.addMouseListener(new MouseAdapter() {
  970. @Override
  971. public void mousePressed(MouseEvent e) {
  972. selectedElements.clear();
  973. holonEleNamesDisplayed = "None ";
  974. // If any empty space is clicked
  975. if (temp == null || temp.getID() != model.getSelectedObjectID()) {
  976. unitGraph.empty();
  977. elementGraph.setText("None ");
  978. }
  979. temp = getActualCps();
  980. // Erase old data in the PropertyTable
  981. if (tableModelProperties.getRowCount() > 0) {
  982. for (int i = tableModelProperties.getRowCount() - 1; i > -1; i--) {
  983. tableModelProperties.removeRow(i);
  984. }
  985. }
  986. if (e.isControlDown() && temp != null) {
  987. if (model.getSelectedCpsObjects().contains(temp)) {
  988. controller.deleteSelectedObject(temp);
  989. } else {
  990. controller.addSelectedObject(temp);
  991. }
  992. }
  993. // Write new data in the PropertyTable
  994. if (temp != null) {
  995. // Name of the CpsObject
  996. Object[] tempName = { "Name", temp.getName() };
  997. tableModelProperties.addRow(tempName);
  998. // Id of the CpsObject
  999. Object[] tempId = { "ID", temp.getID() };
  1000. tableModelProperties.addRow(tempId);
  1001. // For HolonObjects the Total Energy (production or
  1002. // consumption) is calculated
  1003. if (temp instanceof HolonObject) {
  1004. refreshTableHolonElement();
  1005. Object[] tempEnergy = { "Total Energy", ((HolonObject) temp).getCurrentEnergy() };
  1006. tableModelProperties.addRow(tempEnergy);
  1007. } // For HolonSwitches is showed the actual status (active
  1008. // or inactive)
  1009. else if (temp instanceof HolonSwitch) {
  1010. deleteRows(tableModelHolonElementSingle);
  1011. deleteRows(tableModelHolonElementMulti);
  1012. Object[] tempActive = { "Active", ((HolonSwitch) temp).getActiveAt()[model.getCurIteration()] };
  1013. tableModelProperties.addRow(tempActive);
  1014. unitGraph.repaintWithNewSwitch((HolonSwitch) temp);
  1015. elementGraph.setText(temp.getName());
  1016. } else {
  1017. deleteRows(tableModelHolonElementSingle);
  1018. deleteRows(tableModelHolonElementMulti);
  1019. }
  1020. // For Objects the only editable cell is the name
  1021. tableModelProperties.setCellEditable(0, 1, true);
  1022. tableModelProperties.setCellEditable(2, 1, false);
  1023. tableModelProperties.setCellEditable(3, 1, false);
  1024. ArrayList<CpsEdge> temp_array = temp.getConnections();
  1025. // If the clicked object has connections
  1026. if (!temp_array.isEmpty()) {
  1027. boolean first = true;
  1028. for (CpsEdge temp2 : temp_array) {
  1029. if (first) {
  1030. first = false;
  1031. if (temp.getID() != temp2.getA().getID()) {
  1032. Object[] tempConnection = { temp.getName() + " is connected to",
  1033. temp2.getA().getName() + " with ID: " + temp2.getA().getID() };
  1034. tableModelProperties.addRow(tempConnection);
  1035. } else {
  1036. Object[] tempConnection = { temp.getName() + " is connected to",
  1037. temp2.getB().getName() + " with ID: " + temp2.getB().getID() };
  1038. tableModelProperties.addRow(tempConnection);
  1039. }
  1040. } else {
  1041. if (temp.getID() != temp2.getA().getID()) {
  1042. Object[] tempConnection = { "",
  1043. temp2.getA().getName() + " with ID: " + temp2.getA().getID() };
  1044. tableModelProperties.addRow(tempConnection);
  1045. } else {
  1046. Object[] tempConnection = { "",
  1047. temp2.getB().getName() + " with ID: " + temp2.getB().getID() };
  1048. tableModelProperties.addRow(tempConnection);
  1049. }
  1050. }
  1051. }
  1052. }
  1053. } // If the clicked Object is an edge
  1054. else if (model.getSelectedEdge() != null) {
  1055. // Name displayed
  1056. Object[] tempName = { "Name", "Edge: " + model.getSelectedEdge().getA().getName() + " to "
  1057. + model.getSelectedEdge().getB().getName() };
  1058. tableModelProperties.addRow(tempName);
  1059. // Current Flow displayed
  1060. Object[] tempFlow = { "Current flow", model.getSelectedEdge().getFlow() };
  1061. tableModelProperties.addRow(tempFlow);
  1062. // Max Capacity displayed
  1063. Object[] tempCapacity = { "Max. Capacity", model.getSelectedEdge().getCapacity() };
  1064. tableModelProperties.addRow(tempCapacity);
  1065. // Status displayed
  1066. Object[] tempStatus = { "Status", model.getSelectedEdge().getStateEdge() };
  1067. tableModelProperties.addRow(tempStatus);
  1068. // For edges, the only possible editable cell is the max
  1069. // flow
  1070. tableModelProperties.setCellEditable(0, 1, false);
  1071. tableModelProperties.setCellEditable(2, 1, true);
  1072. tableModelProperties.setCellEditable(3, 1, true);
  1073. } else if (getActualCps() == null) {
  1074. deleteRows(tableModelHolonElementSingle);
  1075. deleteRows(tableModelHolonElementMulti);
  1076. } // Update of the HolonElementTable (Single- or
  1077. // Multi-Selection)
  1078. if (model.getSelectedCpsObjects().size() > 1) {
  1079. tableHolonElement.setModel(tableModelHolonElementMulti);
  1080. } else if (model.getSelectedCpsObjects().size() == 1) {
  1081. tableHolonElement.setModel(tableModelHolonElementSingle);
  1082. }
  1083. }
  1084. @Override
  1085. public void mouseReleased(MouseEvent e) {
  1086. refreshTableHolonElement();
  1087. refreshTableProperties();
  1088. if (model.getSelectedCpsObjects().size() > 1) {
  1089. tableHolonElement.setModel(tableModelHolonElementMulti);
  1090. } else if (model.getSelectedCpsObjects().size() == 1) {
  1091. tableHolonElement.setModel(tableModelHolonElementSingle);
  1092. }
  1093. }
  1094. });
  1095. toolBar.add(btnAdd);
  1096. // Del Button
  1097. btnDel.addActionListener(new ActionListener() {
  1098. public void actionPerformed(ActionEvent arg0) {
  1099. Object nodeInfo = tree.getLastSelectedPathComponent();
  1100. if (nodeInfo != null) {
  1101. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
  1102. String nodeName = selectedNode.getUserObject().toString();
  1103. int depthOfNode = selectedNode.getLevel();
  1104. switch (depthOfNode) {
  1105. case 1:
  1106. int dialogResult = JOptionPane.showConfirmDialog(null,
  1107. "Do you realy want to delete the Category " + nodeName + "?", "Warning",
  1108. JOptionPane.YES_NO_OPTION);
  1109. if (dialogResult == JOptionPane.YES_OPTION) {
  1110. controller.deleteCategory(nodeName);
  1111. }
  1112. break;
  1113. case 2:
  1114. DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
  1115. controller.delObjectCategory(parent.getUserObject().toString(), nodeName);
  1116. break;
  1117. default:
  1118. JOptionPane.showMessageDialog(new JFrame(),
  1119. "Please select a Category or an Object in order to delete something.");
  1120. }
  1121. } else {
  1122. JOptionPane.showMessageDialog(new JFrame(),
  1123. "Please select a Category or an Object in order to delete something.");
  1124. }
  1125. tree.repaint();
  1126. }
  1127. });
  1128. toolBar.add(btnDel);
  1129. frmCyberPhysical.getContentPane().add(splitPane);
  1130. mntmNew.addActionListener(new ActionListener() {
  1131. @Override
  1132. public void actionPerformed(ActionEvent arg0) {
  1133. model.getEdgesOnCanvas().removeAll(model.getEdgesOnCanvas());
  1134. model.getObjectsOnCanvas().removeAll(model.getObjectsOnCanvas());
  1135. controller.setSelectedObjectID(0);
  1136. controller.setSelecteEdge(null);
  1137. controller.setCurIteration(0);
  1138. unitGraph.empty();
  1139. elementGraph.setText("None ");
  1140. canvas.tempCps = null;
  1141. canvas.objectSelectionHighlighting();
  1142. canvas.repaint();
  1143. }
  1144. });
  1145. mntmOpen.addActionListener(new java.awt.event.ActionListener() {
  1146. @Override
  1147. public void actionPerformed(java.awt.event.ActionEvent evt) {
  1148. menuFileExitActionPerformed(evt);
  1149. }
  1150. private void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) {
  1151. JFileChooser fileChooser = new JFileChooser();
  1152. JFrame test = new JFrame();
  1153. FileNameExtensionFilter jsonFilter = new FileNameExtensionFilter("*.json", "json");
  1154. fileChooser.setFileFilter(jsonFilter);
  1155. if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) {
  1156. File file = fileChooser.getSelectedFile();
  1157. try {
  1158. controller.loadFile(file.getAbsolutePath());
  1159. canvas.repaint();
  1160. ArrayList<HolonElement> tempList = new ArrayList<>();
  1161. for (CpsObject cps : model.getObjectsOnCanvas()) {
  1162. if (cps instanceof HolonObject) {
  1163. for (HolonElement h : ((HolonObject) cps).getElements()) {
  1164. tempList.add(h);
  1165. unitGraph.repaintWithNewElement(tempList);
  1166. unitGraph.fillArrayofValue();
  1167. tempList.remove(0);
  1168. }
  1169. } else if (cps instanceof HolonSwitch) {
  1170. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  1171. unitGraph.fillArrayofBooleans();
  1172. }
  1173. }
  1174. unitGraph.empty();
  1175. tree.repaint();
  1176. } catch (IOException e) {
  1177. // TODO Auto-generated catch block
  1178. e.printStackTrace();
  1179. }
  1180. }
  1181. }
  1182. });
  1183. mntmSave.addActionListener(new java.awt.event.ActionListener() {
  1184. @Override
  1185. public void actionPerformed(java.awt.event.ActionEvent evt) {
  1186. menuSaveActionPerformed(evt);
  1187. }
  1188. private void menuSaveActionPerformed(java.awt.event.ActionEvent evt) {
  1189. JFileChooser fileChooser = new JFileChooser();
  1190. JFrame test = new JFrame();
  1191. FileNameExtensionFilter jsonFilter = new FileNameExtensionFilter("*.json", "json");
  1192. fileChooser.setFileFilter(jsonFilter);
  1193. if (fileChooser.showSaveDialog(test) == JFileChooser.APPROVE_OPTION) {
  1194. String file = fileChooser.getSelectedFile().getPath();
  1195. if (!file.endsWith(".json"))
  1196. file += ".json";
  1197. try {
  1198. controller.saveFile(new File(file).getAbsolutePath());
  1199. } catch (IOException e) {
  1200. // TODO Auto-generated catch block
  1201. e.printStackTrace();
  1202. }
  1203. }
  1204. }
  1205. });
  1206. mntmUndo.addActionListener(new java.awt.event.ActionListener() {
  1207. @Override
  1208. public void actionPerformed(java.awt.event.ActionEvent evt) {
  1209. menuUndoActionPerformed(evt);
  1210. }
  1211. private void menuUndoActionPerformed(java.awt.event.ActionEvent evt) {
  1212. try {
  1213. controller.loadFile(controller.getUndoSave());
  1214. canvas.repaint();
  1215. ArrayList<HolonElement> tempList = new ArrayList<>();
  1216. for (CpsObject cps : model.getObjectsOnCanvas()) {
  1217. if (cps instanceof HolonObject) {
  1218. for (HolonElement h : ((HolonObject) cps).getElements()) {
  1219. tempList.add(h);
  1220. unitGraph.repaintWithNewElement(tempList);
  1221. unitGraph.fillArrayofValue();
  1222. tempList.remove(0);
  1223. }
  1224. } else if (cps instanceof HolonSwitch) {
  1225. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  1226. unitGraph.fillArrayofBooleans();
  1227. }
  1228. }
  1229. unitGraph.empty();
  1230. } catch (IOException e) {
  1231. // TODO Auto-generated catch block
  1232. e.printStackTrace();
  1233. }
  1234. }
  1235. });
  1236. mntmRedo.addActionListener(new java.awt.event.ActionListener() {
  1237. @Override
  1238. public void actionPerformed(java.awt.event.ActionEvent evt) {
  1239. menuRedoActionPerformed(evt);
  1240. }
  1241. private void menuRedoActionPerformed(java.awt.event.ActionEvent evt) {
  1242. try {
  1243. controller.loadFile(controller.getRedoSave());
  1244. canvas.repaint();
  1245. ArrayList<HolonElement> tempList = new ArrayList<>();
  1246. for (CpsObject cps : model.getObjectsOnCanvas()) {
  1247. if (cps instanceof HolonObject) {
  1248. for (HolonElement h : ((HolonObject) cps).getElements()) {
  1249. tempList.add(h);
  1250. unitGraph.repaintWithNewElement(tempList);
  1251. unitGraph.fillArrayofValue();
  1252. tempList.remove(0);
  1253. }
  1254. } else if (cps instanceof HolonSwitch) {
  1255. unitGraph.repaintWithNewSwitch((HolonSwitch) cps);
  1256. unitGraph.fillArrayofBooleans();
  1257. }
  1258. }
  1259. unitGraph.empty();
  1260. } catch (IOException e) {
  1261. // TODO Auto-generated catch block
  1262. e.printStackTrace();
  1263. }
  1264. }
  1265. });
  1266. mntmSetFolder.addActionListener(new java.awt.event.ActionListener() {
  1267. @Override
  1268. public void actionPerformed(java.awt.event.ActionEvent evt) {
  1269. menuSetFolderActionPerformed(evt);
  1270. }
  1271. private void menuSetFolderActionPerformed(java.awt.event.ActionEvent evt) {
  1272. JFileChooser fileChooser = new JFileChooser();
  1273. JFrame test = new JFrame();
  1274. fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  1275. fileChooser.setAcceptAllFileFilterUsed(false);
  1276. if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) {
  1277. comboBoxAlgo.removeAllItems();
  1278. File[] files = fileChooser.getSelectedFile().listFiles();
  1279. for (int i = 0; i < files.length; i++) {
  1280. if (files[i].toString().endsWith(".java") || files[i].toString().endsWith(".class")) {
  1281. comboBoxAlgo.addItem(files[i]);
  1282. }
  1283. }
  1284. }
  1285. }
  1286. });
  1287. timePanel = new TimePanel(model, controller);
  1288. timePanel.setBorder(null);
  1289. ((JSlider) (timePanel.getComponent(1))).addChangeListener(new ChangeListener() {
  1290. @Override
  1291. public void stateChanged(ChangeEvent e) {
  1292. int i = model.getCurIteration();
  1293. controller.calculateStateForTimeStep(i);
  1294. unitGraph.repaint();
  1295. }
  1296. });
  1297. splitPane.setRightComponent(splitPane_1);
  1298. splitPane.setDividerLocation(200);
  1299. splitPane_1.setDividerLocation(500);
  1300. splitPane_tree_console.setDividerLocation(500);
  1301. splitPane.setLeftComponent(splitPane_tree_console);
  1302. splitPane_tree_console.setLeftComponent(scrollPane_1);
  1303. splitPane_tree_console.setRightComponent(console);
  1304. splitPane_1.setLeftComponent(canvasSP);
  1305. splitPane_1.setRightComponent(split_HolonEl_Pro);
  1306. split_HolonEl_Pro.setDividerLocation(400);
  1307. split_HolonEl_Pro.setTopComponent(split_Graph_HolonEl);
  1308. split_HolonEl_Pro.setBottomComponent(scrollProperties);
  1309. split_Graph_HolonEl.setDividerLocation(150);
  1310. split_Graph_HolonEl.setTopComponent(scrollGraph);
  1311. split_Graph_HolonEl.setBottomComponent(scrollElements);
  1312. canvasSP.setViewportView(canvas);
  1313. canvasSP.setColumnHeaderView(simMenu);
  1314. simMenu.setBackground(new Color(240, 240, 240));
  1315. tabbedPane.setBorder(null);
  1316. scrollProperties.setBorder(null);
  1317. scrollGraph.setBorder(null);
  1318. scrollElements.setBorder(null);
  1319. splitPane.setBorder(null);
  1320. splitPane_1.setBorder(null);
  1321. splitPane_tree_console.setBorder(null);
  1322. split_HolonEl_Pro.setBorder(null);
  1323. split_Graph_HolonEl.setBorder(null);
  1324. panel_HolonEl.setBorder(null);
  1325. tableHolonElementScrollPane.setBorder(null);
  1326. frmCyberPhysical.getContentPane().add(timePanel, BorderLayout.SOUTH);
  1327. simulationSpeedField.setText(Integer.toString(model.getTimerSpeed()));
  1328. btnApply.addActionListener(new ActionListener() {
  1329. public void actionPerformed(ActionEvent e) {
  1330. int speed = Integer.parseInt(simulationSpeedField.getText());
  1331. controller.setTimerSpeed(speed);
  1332. mnSimulationSpeed.setPopupMenuVisible(false);
  1333. }
  1334. });
  1335. mnSimulationSpeed.add(btnApply);
  1336. menuBar.add(comboBoxAlgo);
  1337. Dimension height = comboBoxAlgo.getPreferredSize();
  1338. comboBoxAlgo.setPreferredSize(new Dimension(200, (int) height.getHeight()));
  1339. comboBoxAlgo.setMaximumSize(comboBoxAlgo.getPreferredSize());
  1340. }
  1341. /*
  1342. * adds a specific object type to selected Category also handles input
  1343. * windows and illegal inputs
  1344. */
  1345. public void addObjectAction(String objType, DefaultMutableTreeNode selectedNode) {
  1346. if (selectedNode == null) {
  1347. JOptionPane.showMessageDialog(new JFrame(),
  1348. "Please select a Category first before adding " + objType + ".");
  1349. }
  1350. // if selected node is a directory for Categories
  1351. else {
  1352. if (selectedNode.getLevel() == 1) {
  1353. String objname = JOptionPane.showInputDialog("Please enter a Name for the " + objType);
  1354. Category cat = controller.searchCategory(selectedNode.getUserObject().toString());
  1355. if (objname.length() != 0) {
  1356. switch (objType) {
  1357. case "Switch":
  1358. controller.addSwitch(cat, objname);
  1359. break;
  1360. case "Transformer":
  1361. controller.addTransformer(cat, objname);
  1362. break;
  1363. }
  1364. }
  1365. } else {
  1366. JOptionPane.showMessageDialog(new JFrame(),
  1367. "Objects can not be added to Objects. Please select a Category.");
  1368. }
  1369. }
  1370. }
  1371. /**
  1372. * reloads the Categories from Model
  1373. */
  1374. public void updateCategories(final ArrayList<Category> categories) {
  1375. tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
  1376. {
  1377. DefaultMutableTreeNode node_1;
  1378. for (Category c : categories) {
  1379. node_1 = new DefaultMutableTreeNode(c.getName());
  1380. // kann eventuell umgeändert werden
  1381. for (CpsObject obj : c.getObjects()) {
  1382. node_1.add(new DefaultMutableTreeNode(obj.getObjName()));
  1383. }
  1384. add(node_1);
  1385. }
  1386. }
  1387. }));
  1388. }
  1389. /**
  1390. *
  1391. */
  1392. public void onChange(ArrayList<Category> categories) {
  1393. DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
  1394. updateCategories(categories);
  1395. model.reload();
  1396. }
  1397. /**
  1398. *
  1399. * @return
  1400. */
  1401. public JFrame getFrmCyberPhysical() {
  1402. return frmCyberPhysical;
  1403. }
  1404. /**
  1405. * Getter for selected CpsObject
  1406. *
  1407. * @return selected CpsObject
  1408. */
  1409. public CpsObject getActualCps() {
  1410. int tempID = model.getSelectedObjectID();
  1411. CpsObject tempCps = controller.searchByID(tempID);
  1412. return tempCps;
  1413. }
  1414. /**
  1415. * Search for actual selected HolonElement
  1416. *
  1417. * @param obj
  1418. * selected HolonObject, if obj==null means multi-selection
  1419. * active
  1420. * @param yValue
  1421. * Y-Coord in the HolonElementsTable
  1422. * @param toMultiHash
  1423. * 0 means no MultiSelection, 1 means MultiSelection without
  1424. * Control, 2 means MultiSelection with Control
  1425. * @return the selected HolonElement
  1426. */
  1427. public HolonElement getActualHolonElement(HolonObject obj, int yValue, int toMultiHash) {
  1428. final int yTemp = (int) Math.floor(yValue / 16);
  1429. int rowsTotal = 0;
  1430. // Filter for search --> single and multi selection
  1431. if (obj == null) {
  1432. rowsTotal = tableModelHolonElementMulti.getRowCount();
  1433. } else {
  1434. rowsTotal = tableModelHolonElementSingle.getRowCount();
  1435. }
  1436. // search for the clicked HolonObject and HolonElement --> in the
  1437. // HolonElementTable
  1438. HolonObject obtTemp = null;
  1439. HolonElement toReturnEle = null;
  1440. int id = 0;
  1441. if (rowsTotal != 0 && rowsTotal > yTemp) {
  1442. // Multi-Selection search
  1443. if (obj == null) {
  1444. String tempStringObj = tableModelHolonElementMulti.getValueAt(yTemp, 0).toString();
  1445. int idTempObj = Integer.parseInt(tempStringObj.split(", ")[1]);
  1446. obtTemp = (HolonObject) controller.searchByID(idTempObj);
  1447. id = Integer.parseInt(tableModelHolonElementMulti.getValueAt(yTemp, 1).toString());
  1448. ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
  1449. if (eleToDelete.containsKey(idTempObj) && toMultiHash == 2) {
  1450. eleTemp = eleToDelete.get(idTempObj);
  1451. if (!eleTemp.contains(obtTemp.searchElementById(id))) {
  1452. eleTemp.add(obtTemp.searchElementById(id));
  1453. eleToDelete.replace(idTempObj, eleTemp);
  1454. }
  1455. } else if (toMultiHash == 2) {
  1456. eleTemp.add(obtTemp.searchElementById(id));
  1457. eleToDelete.put(idTempObj, eleTemp);
  1458. } else if (toMultiHash == 1) {
  1459. eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
  1460. eleTemp.add(obtTemp.searchElementById(id));
  1461. eleToDelete.put(idTempObj, eleTemp);
  1462. } else if (toMultiHash == 0) {
  1463. toReturnEle = obtTemp.searchElementById(id);
  1464. }
  1465. } // Single-Selection search
  1466. else {
  1467. eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
  1468. id = Integer.parseInt(tableModelHolonElementSingle.getValueAt(yTemp, 0).toString());
  1469. toReturnEle = obj.searchElementById(id);
  1470. }
  1471. model.setSelectedHolonElement(toReturnEle);
  1472. return toReturnEle;
  1473. } // If no HolonObject selected
  1474. else {
  1475. eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
  1476. model.setSelectedHolonElement(null);
  1477. return null;
  1478. }
  1479. }
  1480. /**
  1481. * Search for clicked HolonObject through the mouse's y-Coord
  1482. *
  1483. * @param yValue
  1484. * @return clicked HolonObject
  1485. */
  1486. public HolonObject getHolonObj(int yValue) {
  1487. final int yTemp = (int) Math.floor(yValue / 16);
  1488. HolonObject obtTemp = null;
  1489. String temp = tableModelHolonElementMulti.getValueAt(yTemp, 0).toString();
  1490. int idTemp = Integer.parseInt(temp.split(", ")[1]);
  1491. obtTemp = (HolonObject) controller.searchByID(idTemp);
  1492. return obtTemp;
  1493. }
  1494. /**
  1495. * Update the HolonElement Table, that means erase all rows and add the new
  1496. * rows with new data
  1497. */
  1498. public void refreshTableHolonElement() {
  1499. // Update of the Information about the HolonElements - only for
  1500. // HolonObjects
  1501. if (model.getSelectedCpsObjects().size() > 1) {
  1502. deleteRows(tableModelHolonElementMulti);
  1503. fillElementTable(model.getSelectedCpsObjects());
  1504. tableModelHolonElementMulti.fireTableDataChanged();
  1505. } else if (model.getSelectedCpsObjects().size() == 1) {
  1506. deleteRows(tableModelHolonElementSingle);
  1507. fillElementTable(model.getSelectedCpsObjects());
  1508. tableModelHolonElementSingle.fireTableDataChanged();
  1509. }
  1510. }
  1511. /**
  1512. * Erase all information of the HolonElement Model
  1513. */
  1514. public void deleteRows(PropertyTable t) {
  1515. if (t.getRowCount() > 0) {
  1516. for (int i = t.getRowCount() - 1; i > -1; i--) {
  1517. t.removeRow(i);
  1518. }
  1519. }
  1520. }
  1521. /**
  1522. * Add the Information of the given ArrayList in the HolonElement Model as
  1523. * Name,Energy and Amount
  1524. *
  1525. * @param elements
  1526. * ArrayList to be displayed
  1527. */
  1528. public void fillElementTable(ArrayList<CpsObject> objects) {
  1529. if (objects.size() > 1) {
  1530. for (CpsObject o : objects) {
  1531. if (o instanceof HolonObject) {
  1532. for (HolonElement he : ((HolonObject) o).getElements()) {
  1533. Object[] temp = { o.getName() + ", " + o.getID(), he.getId(), he.getEleName(), he.getEnergy(),
  1534. he.getAmount(), he.getActive() };
  1535. tableModelHolonElementMulti.addRow(temp);
  1536. }
  1537. }
  1538. }
  1539. } else if (objects.size() == 1) {
  1540. CpsObject o = objects.get(0);
  1541. if (o instanceof HolonObject) {
  1542. for (HolonElement he : ((HolonObject) o).getElements()) {
  1543. Object[] temp = { he.getId(), he.getEleName(), he.getEnergy(), he.getAmount(), he.getActive() };
  1544. tableModelHolonElementSingle.addRow(temp);
  1545. }
  1546. }
  1547. }
  1548. }
  1549. /**
  1550. * Update the information concerning properties of the selected CpsObject
  1551. */
  1552. public void refreshTableProperties() {
  1553. if (model.getSelectedCpsObjects().size() == 1) {
  1554. CpsObject tempCps = getActualCps();
  1555. if (tempCps != null && tempCps.getClass() == HolonObject.class) {
  1556. tableModelProperties.removeRow(2);
  1557. Object[] tempEnergy = { "Total Energy", ((HolonObject) tempCps).getCurrentEnergy() };
  1558. tableModelProperties.insertRow(2, tempEnergy);
  1559. }
  1560. }
  1561. }
  1562. private static void addPopup(Component component, final JPopupMenu popup) {
  1563. component.addMouseListener(new MouseAdapter() {
  1564. public void mousePressed(MouseEvent e) {
  1565. if (e.isPopupTrigger()) {
  1566. showMenu(e);
  1567. }
  1568. }
  1569. public void mouseReleased(MouseEvent e) {
  1570. if (e.isPopupTrigger()) {
  1571. showMenu(e);
  1572. }
  1573. }
  1574. private void showMenu(MouseEvent e) {
  1575. popup.show(e.getComponent(), e.getX(), e.getY());
  1576. }
  1577. });
  1578. }
  1579. }