FlexWindow.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.FlowLayout;
  6. import java.awt.GridBagConstraints;
  7. import java.awt.GridBagLayout;
  8. import java.awt.Insets;
  9. import java.awt.Rectangle;
  10. import java.awt.Dialog.ModalityType;
  11. import java.awt.Dimension;
  12. import java.awt.event.ItemEvent;
  13. import java.awt.event.MouseAdapter;
  14. import java.awt.event.MouseEvent;
  15. import java.awt.image.BufferedImage;
  16. import java.math.RoundingMode;
  17. import java.text.NumberFormat;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Locale;
  21. import java.util.stream.Collectors;
  22. import javax.swing.BorderFactory;
  23. import javax.swing.Box;
  24. import javax.swing.BoxLayout;
  25. import javax.swing.DefaultComboBoxModel;
  26. import javax.swing.ImageIcon;
  27. import javax.swing.JButton;
  28. import javax.swing.JCheckBox;
  29. import javax.swing.JComboBox;
  30. import javax.swing.JDialog;
  31. import javax.swing.JFormattedTextField;
  32. import javax.swing.JFrame;
  33. import javax.swing.JLabel;
  34. import javax.swing.JMenu;
  35. import javax.swing.JMenuBar;
  36. import javax.swing.JMenuItem;
  37. import javax.swing.JOptionPane;
  38. import javax.swing.JPanel;
  39. import javax.swing.JPopupMenu;
  40. import javax.swing.JScrollPane;
  41. import javax.swing.JTabbedPane;
  42. import javax.swing.JTree;
  43. import javax.swing.SwingUtilities;
  44. import javax.swing.border.EmptyBorder;
  45. import javax.swing.text.NumberFormatter;
  46. import javax.swing.tree.DefaultMutableTreeNode;
  47. import javax.swing.tree.DefaultTreeModel;
  48. import javax.swing.tree.TreePath;
  49. import classes.AbstractCanvasObject;
  50. import classes.Constrain;
  51. import classes.GroupNode;
  52. import classes.Flexibility;
  53. import classes.HolonElement;
  54. import classes.HolonElement.Priority;
  55. import classes.HolonObject;
  56. import ui.controller.Control;
  57. import ui.controller.FlexManager;
  58. import ui.controller.FlexManager.FlexState;
  59. import ui.controller.FlexManager.FlexWrapper;
  60. import ui.model.Model;
  61. import util.ImageImport;
  62. public class FlexWindow extends JFrame {
  63. private JPanel nothingSelectedPanel;
  64. private JPanel selectedPanel;
  65. private JTabbedPane contentPanel = new JTabbedPane();
  66. private JScrollPane usageViewPanel;
  67. private Control controller;
  68. private Model model;
  69. public boolean isClosed = false;
  70. //Flexibility Intermediate
  71. private Flexibility intermediateFlex = new Flexibility(null);
  72. private boolean offered = true, onConstrain = true, offConstrain =false;
  73. //JTree
  74. private DefaultMutableTreeNode listOfAllSelectedHolonObjects;
  75. private JTree stateTree;
  76. private DefaultTreeModel treeModel;
  77. private FlexManager flexmanager;
  78. //Tabs
  79. String gridTabString = "Grid";
  80. String orderTabString = "Order";
  81. //FlexToFlexWrapper()
  82. public FlexWindow(JFrame parentFrame, ui.controller.Control controller){
  83. this.intermediateFlex.name = "name";
  84. this.controller = controller;
  85. this.model = controller.getModel();
  86. //InitWindow
  87. createMenuBar();
  88. initWindowPanel(parentFrame);
  89. this.addWindowListener(new java.awt.event.WindowAdapter() {
  90. @Override
  91. public void windowClosing(java.awt.event.WindowEvent windowEvent) {
  92. isClosed = true;
  93. }
  94. });
  95. updateSelectedPanel();
  96. //this.pack();
  97. }
  98. private void initWindowPanel(JFrame parentFrame) {
  99. this.setBounds(0, 0, 400, parentFrame.getHeight()>20?parentFrame.getHeight()- 20:parentFrame.getHeight());
  100. this.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
  101. this.setTitle("Flexibility");
  102. this.setLocationRelativeTo(parentFrame);
  103. this.setVisible(true);
  104. //this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  105. createNothingSelectedPanel();
  106. createSelectedPanel();
  107. createUsageViewPanel();
  108. contentPanel.addTab(gridTabString, nothingSelectedPanel);
  109. contentPanel.addTab(orderTabString, usageViewPanel);
  110. contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
  111. this.setContentPane(contentPanel);
  112. this.revalidate();
  113. }
  114. private void createMenuBar(){
  115. JMenuBar menuBar = new JMenuBar();
  116. JMenu canvas = new JMenu("Canvas");
  117. menuBar.add(canvas);
  118. JMenuItem updateMenuItem = new JMenuItem("Update");
  119. updateMenuItem.addActionListener(clicked -> updateSelectedPanel());
  120. canvas.add(updateMenuItem);
  121. JMenu flex = new JMenu("Flex");
  122. menuBar.add(flex);
  123. JMenuItem addMenuItem = new JMenuItem("Add Flexibility");
  124. addMenuItem.addActionListener(clicked -> createAddDialog(null));
  125. flex.add(addMenuItem);
  126. JMenuItem deleteMenuItem = new JMenuItem("Delete Flexibility");
  127. deleteMenuItem.addActionListener(clicked -> createDeleteDialog());
  128. flex.add(deleteMenuItem);
  129. this.setJMenuBar(menuBar);
  130. }
  131. private void createUsageViewPanel() {
  132. // flexmanager = controller.getSimManager().getActualFlexManager();
  133. //GridBagApprouch
  134. JPanel gridbagPanel = new JPanel(new GridBagLayout());
  135. usageViewPanel = new JScrollPane(gridbagPanel);
  136. gridbagPanel.setBackground(Color.white);
  137. //5breit
  138. FlexState[] titles = FlexState.values();
  139. for(int i = 0; i<5; i++){
  140. // List<FlexWrapper> listOfFlexWithState = flexmanager.getAllFlexWrapperWithState(titles[i]);
  141. FlexState state = titles[i];
  142. List<FlexWrapper> listOfFlexWithState = controller.getModel().getHolonsByID().values().stream()
  143. .map(h -> h.getParent() != null ?
  144. h.holonControlUnit.getFlexMan().getFlexManager(controller.getModel().getCurIteration()).getAllFlexWrapperWithState(state) :
  145. new ArrayList<FlexWrapper>())
  146. .flatMap(List::stream)
  147. .collect(Collectors.toList());
  148. JLabel label = new JLabel(titles[i].toString() + "[" + listOfFlexWithState.size()+ "]");
  149. GridBagConstraints labelC = new GridBagConstraints();
  150. labelC.gridx = 1;
  151. labelC.gridy = i*2;
  152. labelC.anchor = GridBagConstraints.LINE_START;
  153. labelC.fill = GridBagConstraints.HORIZONTAL;
  154. labelC.weightx = 0.5;
  155. labelC.weighty = 0.0;
  156. gridbagPanel.add(label, labelC);
  157. JPanel listPanel = new JPanel(new GridBagLayout());
  158. createFlexPanel(listPanel, listOfFlexWithState);
  159. GridBagConstraints panelC = new GridBagConstraints();
  160. panelC.gridx = 0;
  161. panelC.gridwidth = 2;
  162. panelC.gridy = i*2 +1;
  163. panelC.fill = GridBagConstraints.BOTH;
  164. gridbagPanel.add(listPanel, panelC);
  165. JButton expandButton = new JButton("-");
  166. GridBagConstraints buttonC = new GridBagConstraints();
  167. buttonC.gridx = 0;
  168. buttonC.gridy = i*2;
  169. gridbagPanel.add(expandButton, buttonC);
  170. expandButton.addActionListener(clicked -> {
  171. listPanel.setVisible(!listPanel.isVisible());
  172. expandButton.setText(listPanel.isVisible()?"-":"+");
  173. });
  174. }
  175. //Add Spacer
  176. JLabel spacer = new JLabel();
  177. GridBagConstraints c = new GridBagConstraints();
  178. c.gridx = 0;
  179. c.gridy = 5*2;
  180. c.fill = GridBagConstraints.VERTICAL;
  181. c.weightx = 0.0;
  182. c.weighty = 1;
  183. gridbagPanel.add(spacer, c);
  184. }
  185. private void createFlexPanel(JPanel listPanel, List<FlexWrapper> flexWrapperList) {
  186. listPanel.setBackground(Color.white);
  187. Insets insets = new Insets(2,2,2,2);
  188. //String[] flexesString = flexWrapperList.stream().map(flexWrapper -> flexWrapper.getFlex().name).toArray(String[]::new);
  189. for(int i = 0; i < flexWrapperList.size(); i++) {
  190. FlexWrapper actual = flexWrapperList.get(i);
  191. GridBagConstraints c = new GridBagConstraints();
  192. c.gridx = Math.floorMod(i, 5);
  193. c.weightx = 0.0;
  194. c.insets = insets;
  195. JButton labelButton = new JButton(actual.getFlex().name);
  196. labelButton.setPreferredSize(new Dimension(70,70));
  197. labelButton.setBorder(BorderFactory.createLineBorder(Color.black));
  198. listPanel.add(labelButton, c);
  199. labelButton.addActionListener(clicked ->{
  200. // actual.order();
  201. actual.getFlex().getElement().orderFlex(actual.getFlex(), this.controller.getModel().getCurIteration());
  202. controller.calculateStateAndVisualForCurrentTimeStep();
  203. controller.updateCanvas();
  204. });
  205. labelButton.setToolTipText(createToolTipp(actual));
  206. }
  207. //AddSpacer
  208. JLabel spacer = new JLabel();
  209. GridBagConstraints c = new GridBagConstraints();
  210. c.gridx = 5;
  211. c.gridy = 0;
  212. c.fill = GridBagConstraints.VERTICAL;
  213. c.weightx = 1;
  214. c.weighty = 0;
  215. listPanel.add(spacer, c);
  216. }
  217. private String createToolTipp(FlexWrapper actual) {
  218. String tooltipString = "<html>" +
  219. "<b>" + actual.getFlex().name + "( </b>" + actual.getFlex().getElement().getName() + "<b> )</b><br>"
  220. + ((actual.remainingDuration() != 0)?"<i>Remaining Duration:"+ actual.remainingDuration()+"</i><br>":"")
  221. + ((actual.remainingTimeTillActivation() != 0)?"<i>Remaining TimeTillActivation:"+ actual.remainingTimeTillActivation()+"</i><br>":"")
  222. + "Duration: " + actual.getFlex().getDuration() + "<br>"
  223. + "Cooldown: " + actual.getFlex().getCooldown() + "<br>"
  224. //+ "Speed: " + actual.getFlex().speed + "<br>"
  225. + "Cost: " + actual.getFlex().cost + "<br>"
  226. + "BrigtMir: " + actual.getFlex().bringtmir() + "<br>"
  227. + "Constrains: " + actual.getFlex().constrainList.stream().map(constrain -> constrain.getName()).collect(Collectors.joining( "," )) + "<br>"
  228. + "</html>";
  229. return tooltipString;
  230. }
  231. public void update() {
  232. updateSelectedPanel();
  233. createUsageViewPanel();
  234. contentPanel.setComponentAt(contentPanel.indexOfTab(orderTabString), usageViewPanel);
  235. contentPanel.revalidate();
  236. }
  237. private void createSelectedPanel() {
  238. //Liste aller Flexibilities
  239. listOfAllSelectedHolonObjects = new DefaultMutableTreeNode("HolonObjects");
  240. treeModel = new DefaultTreeModel(listOfAllSelectedHolonObjects);
  241. stateTree = new JTree(treeModel);
  242. stateTree.addMouseListener ( new MouseAdapter ()
  243. {
  244. public void mousePressed ( MouseEvent e )
  245. {
  246. if ( SwingUtilities.isRightMouseButton ( e ) )
  247. {
  248. TreePath pathUnderCursor = stateTree.getPathForLocation ( e.getX (), e.getY () );
  249. Rectangle pathBounds = stateTree.getUI ().getPathBounds ( stateTree, pathUnderCursor );
  250. if ( pathBounds != null && pathBounds.contains ( e.getX (), e.getY () ) )
  251. {
  252. TreePath[] selectedPaths = stateTree.getSelectionPaths();
  253. if(selectedPaths == null) {
  254. stateTree.addSelectionPath(pathUnderCursor);
  255. }else {
  256. boolean isInselectedPaths = false;
  257. for (TreePath path : stateTree.getSelectionPaths()) {
  258. if(path.equals(pathUnderCursor)) {
  259. isInselectedPaths = true;
  260. }
  261. }
  262. if(!isInselectedPaths) {
  263. stateTree.clearSelection();
  264. stateTree.addSelectionPath(pathUnderCursor);
  265. }
  266. }
  267. JPopupMenu menu = new JPopupMenu ();
  268. JMenuItem priorityItem = new JMenuItem("EditPriorities");
  269. JMenuItem flexItem = new JMenuItem("AddFlex");
  270. priorityItem.addActionListener(clicked -> {
  271. Priority prio = null;
  272. if (stateTree.getSelectionPaths() != null)
  273. for (TreePath path : stateTree.getSelectionPaths()) {
  274. Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
  275. .getUserObject();
  276. if (treeNodeUserObject instanceof ElementInfo) {
  277. if (prio == null)
  278. prio = (Priority) JOptionPane.showInputDialog(stateTree,
  279. "Select the Priority:", "Priority?", JOptionPane.OK_OPTION,
  280. new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)),
  281. Priority.values(), "");
  282. if (prio == null)
  283. break;
  284. ElementInfo eleInfo = (ElementInfo) treeNodeUserObject;
  285. eleInfo.ele.setPriority(prio);
  286. treeModel.reload((DefaultMutableTreeNode) path.getLastPathComponent());
  287. }
  288. }
  289. });
  290. flexItem.addActionListener(clicked -> {
  291. TreePath path = stateTree.getSelectionPath();
  292. if (path == null)
  293. return;
  294. Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
  295. .getUserObject();
  296. if (!(treeNodeUserObject instanceof ElementInfo))
  297. return;
  298. createAddDialog(((ElementInfo) treeNodeUserObject).ele);
  299. });
  300. menu.add ( priorityItem );
  301. menu.add ( flexItem );
  302. menu.show ( stateTree, pathBounds.x, pathBounds.y + pathBounds.height );
  303. }else {
  304. JPopupMenu menu = new JPopupMenu ();
  305. menu.add ( new JMenuItem ( "Other Test" ) );
  306. menu.show ( stateTree, e.getX(), e.getY() );
  307. }
  308. }
  309. }
  310. } );
  311. selectedPanel = new JPanel(new BorderLayout());
  312. selectedPanel.add(new JScrollPane(stateTree));
  313. }
  314. private void createNothingSelectedPanel() {
  315. nothingSelectedPanel = new JPanel();
  316. nothingSelectedPanel.setLayout(new BoxLayout(nothingSelectedPanel, BoxLayout.PAGE_AXIS));
  317. JLabel nothingSelectedTextLabel = new JLabel("No HolonObject exist.");
  318. nothingSelectedTextLabel.setForeground(Color.gray);
  319. nothingSelectedTextLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
  320. nothingSelectedPanel.add(Box.createVerticalGlue());
  321. nothingSelectedPanel.add(nothingSelectedTextLabel);
  322. nothingSelectedPanel.add(Box.createVerticalGlue());
  323. }
  324. public void updateSelectedPanel() {
  325. //UpdateFlexManager
  326. flexmanager = controller.getSimManager().getActualFlexManager();
  327. listOfAllSelectedHolonObjects.removeAllChildren();
  328. //Init with HolonObjects
  329. for(AbstractCanvasObject aCps: model.getObjectsOnCanvas()) {
  330. DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
  331. if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
  332. if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
  333. listOfAllSelectedHolonObjects.add(newObjectChild);
  334. }
  335. treeModel.nodeStructureChanged(listOfAllSelectedHolonObjects);
  336. stateTree.revalidate();
  337. expandAll(stateTree);
  338. selectedPanel.revalidate();
  339. contentPanel.setComponentAt(contentPanel.indexOfTab(gridTabString), selectedPanel);
  340. contentPanel.revalidate();
  341. this.revalidate();
  342. }
  343. private void expandAll(JTree tree) {
  344. for(int i = 0; i< tree.getRowCount() ; i++) {
  345. tree.expandRow(i);
  346. }
  347. }
  348. private void expandTreeUpperNode(GroupNode groupNode, DefaultMutableTreeNode root) {
  349. for(AbstractCanvasObject aCps: groupNode.getNodes()) {
  350. DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
  351. if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
  352. if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
  353. root.add(newObjectChild);
  354. }
  355. }
  356. private void expandTreeHolonObject(HolonObject hObject, DefaultMutableTreeNode root) {
  357. for(HolonElement hElement: hObject.getElements()) {
  358. DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(new ElementInfo(hElement));
  359. expandTreeFlex(hElement, newChild);
  360. root.add(newChild);
  361. }
  362. }
  363. private void expandTreeFlex(HolonElement hElement, DefaultMutableTreeNode root) {
  364. for(Flexibility flex: hElement.flexList) {
  365. // FlexWrapper flexWrapper = this.flexmanager.getFlexWrapperFromFlexibility(flex);
  366. FlexWrapper flexWrapper = hElement.holon.holonControlUnit.getFlexMan()
  367. .getFlexManager(controller.getModel().getCurIteration()).getFlexWrapperFromFlexibility(flex);
  368. String flexState = "";
  369. if(flexWrapper != null) {
  370. Color color = this.FlexStateToColor(flexWrapper.getState());
  371. flexState = "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + flexWrapper.getState().name() + "</font>";
  372. }
  373. DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("<html>"+ flexState + " <b>" + flex.name+ "</b>" + "</html>");
  374. root.add(newChild);
  375. }
  376. }
  377. private void createDeleteDialog() {
  378. List<HolonObject> list= createListOfHolonObjects(model.getObjectsOnCanvas());
  379. //String test = list.stream().map(Object::toString).collect(Collectors.joining(","));
  380. Object[] allFlexes = list.stream().flatMap(hObject -> hObject.getElements().stream()).flatMap(hElement -> hElement.flexList.stream()).toArray(size -> new Flexibility[size]);
  381. if(allFlexes.length == 0) {
  382. JOptionPane.showMessageDialog(this,
  383. "No Flexibility exist.",
  384. "Warning",
  385. JOptionPane.WARNING_MESSAGE);
  386. return;
  387. }
  388. Flexibility toDeleteFlex =(Flexibility) JOptionPane.showInputDialog(this, "Select to Delete Flexibility:", "Flexibility?", JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , allFlexes, "");
  389. if(toDeleteFlex != null) {
  390. toDeleteFlex.getElement().flexList.remove(toDeleteFlex);
  391. controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
  392. updateSelectedPanel();
  393. }
  394. }
  395. private List<HolonObject> createListOfHolonObjects(List<AbstractCanvasObject> objectsOnCanvas) {
  396. List<HolonObject> list = new ArrayList<HolonObject>();
  397. for(AbstractCanvasObject aCps : objectsOnCanvas) {
  398. if(aCps instanceof HolonObject) list.add((HolonObject) aCps);
  399. else if (aCps instanceof GroupNode) list.addAll(createListOfHolonObjects(((GroupNode)aCps).getNodes()));
  400. }
  401. return list;
  402. }
  403. //Add Element
  404. private void createAddDialog(HolonElement element){
  405. if(model.getObjectsOnCanvas().isEmpty()) {
  406. JOptionPane.showMessageDialog(this,
  407. "No HolonObject exist.",
  408. "Warning",
  409. JOptionPane.WARNING_MESSAGE);
  410. return;
  411. }
  412. JDialog addDialog = new JDialog();
  413. addDialog.setTitle("Create Flexibility");
  414. addDialog.setBounds(0, 0, 820, 400);
  415. addDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  416. JPanel dialogPanel = new JPanel(new BorderLayout());
  417. addDialog.setContentPane(dialogPanel);
  418. JPanel selectionPanel = new JPanel(null);
  419. dialogPanel.add(selectionPanel, BorderLayout.CENTER);
  420. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  421. dialogPanel.add(buttonPanel, BorderLayout.PAGE_END);
  422. addDialog.setModalityType(ModalityType.APPLICATION_MODAL);
  423. //Erstelle HolonObject AuswahlBox
  424. HolonObject[] holonObjects = createListOfHolonObjects(model.getObjectsOnCanvas()).stream().toArray(HolonObject[]::new);
  425. DefaultComboBoxModel<HolonObject> comboBoxModel = new DefaultComboBoxModel<HolonObject>( holonObjects );
  426. JComboBox<HolonObject> holonObjectSelector = new JComboBox<HolonObject>(comboBoxModel);
  427. holonObjectSelector.setBounds(10,30, 800, 30);
  428. DefaultComboBoxModel<HolonElement> comboBoxModelElements = new DefaultComboBoxModel<HolonElement>( holonObjects[0].getElements().stream().toArray(size -> new HolonElement[size]));
  429. JComboBox<HolonElement> holonElementSelector = new JComboBox<HolonElement>(comboBoxModelElements);
  430. holonElementSelector.setBounds(10,80, 800, 30);
  431. holonObjectSelector.addItemListener(aListener -> {
  432. if(aListener.getStateChange() == ItemEvent.SELECTED) {
  433. DefaultComboBoxModel<HolonElement> newComboBoxModelElements = new DefaultComboBoxModel<HolonElement>( ((HolonObject) aListener.getItem()).getElements().stream().toArray(size -> new HolonElement[size]));
  434. holonElementSelector.setModel(newComboBoxModelElements);
  435. }
  436. });
  437. if(element == null) {
  438. selectionPanel.add(holonObjectSelector);
  439. selectionPanel.add(holonElementSelector);
  440. JLabel selectObjectLabel = new JLabel("Select HolonObject:");
  441. selectObjectLabel.setBounds(10, 10, 200, 20);
  442. selectionPanel.add(selectObjectLabel);
  443. JLabel selectElementLabel = new JLabel("Select HolonElement:");
  444. selectElementLabel.setBounds(10, 60, 200, 20);
  445. selectionPanel.add(selectElementLabel);
  446. }
  447. else {
  448. JLabel selectElementLabel = new JLabel("Selected: " +element.toString());
  449. selectElementLabel.setBounds(10, 60, 2000, 20);
  450. selectionPanel.add(selectElementLabel);
  451. }
  452. JPanel flexAttributesBorderPanel = new JPanel(null);
  453. flexAttributesBorderPanel.setBounds(10, 120, 800, 200);
  454. flexAttributesBorderPanel.setBorder(BorderFactory.createTitledBorder("Flexibility Attributes"));
  455. selectionPanel.add(flexAttributesBorderPanel);
  456. JLabel flexNameLabel = new JLabel("Name:");
  457. flexNameLabel.setBounds(10,20, 50, 20);
  458. flexAttributesBorderPanel.add(flexNameLabel);
  459. JFormattedTextField nameTextField = new JFormattedTextField(intermediateFlex.name);
  460. nameTextField.addPropertyChangeListener(changed -> intermediateFlex.name = nameTextField.getText());
  461. nameTextField.setBounds(80, 15, 200, 30);
  462. flexAttributesBorderPanel.add(nameTextField);
  463. JLabel flexSpeedLabel = new JLabel("Speed:");
  464. flexSpeedLabel.setBounds(10,55, 50, 20);
  465. flexAttributesBorderPanel.add(flexSpeedLabel);
  466. //Integer formatter
  467. NumberFormat format = NumberFormat.getIntegerInstance();
  468. format.setGroupingUsed(false);
  469. format.setParseIntegerOnly(true);
  470. NumberFormatter integerFormatter = new NumberFormatter(format);
  471. integerFormatter.setMinimum(0);
  472. integerFormatter.setCommitsOnValidEdit(true);
  473. JFormattedTextField speedTextField = new JFormattedTextField(integerFormatter);
  474. speedTextField.setValue(intermediateFlex.speed);
  475. speedTextField.setToolTipText("Only positive Integer.");
  476. speedTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.speed = Integer.parseInt(speedTextField.getValue().toString()));
  477. speedTextField.setBounds(80, 50, 200, 30);
  478. flexAttributesBorderPanel.add(speedTextField);
  479. speedTextField.setEnabled(false);
  480. JLabel flexDurationLabel = new JLabel("Duration:");
  481. flexDurationLabel.setBounds(10,90, 70, 20);
  482. flexAttributesBorderPanel.add(flexDurationLabel);
  483. NumberFormatter moreThenZeroIntegerFormater = new NumberFormatter(format);
  484. moreThenZeroIntegerFormater.setMinimum(1);
  485. moreThenZeroIntegerFormater.setCommitsOnValidEdit(true);
  486. JFormattedTextField durationTextField = new JFormattedTextField(moreThenZeroIntegerFormater);
  487. durationTextField.setValue(intermediateFlex.getDuration());
  488. durationTextField.setToolTipText("Only positive Integer bigger then 0.");
  489. durationTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setDuration(Integer.parseInt(durationTextField.getValue().toString())));
  490. durationTextField.setBounds(80, 85, 200, 30);
  491. flexAttributesBorderPanel.add(durationTextField);
  492. JLabel flexCostsLabel = new JLabel("Costs:");
  493. flexCostsLabel.setBounds(10,125, 70, 20);
  494. flexAttributesBorderPanel.add(flexCostsLabel);
  495. //Double Format:
  496. NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
  497. doubleFormat.setMinimumFractionDigits(1);
  498. doubleFormat.setMaximumFractionDigits(2);
  499. doubleFormat.setRoundingMode(RoundingMode.HALF_UP);
  500. //CostFormatter:
  501. NumberFormatter costsFormatter = new NumberFormatter(doubleFormat);
  502. costsFormatter.setMinimum(0.0);
  503. JFormattedTextField costTextField = new JFormattedTextField(costsFormatter);
  504. costTextField.setValue(intermediateFlex.cost);
  505. costTextField.setToolTipText("Only non negative Double with DecimalSeperator Point('.').");
  506. costTextField.addPropertyChangeListener(propertyChange -> intermediateFlex.cost = Float.parseFloat(costTextField.getValue().toString()));
  507. costTextField.setBounds(80, 120, 200, 30);
  508. flexAttributesBorderPanel.add(costTextField);
  509. JLabel flexCooldownLabel = new JLabel("Cooldown:");
  510. flexCooldownLabel.setBounds(310,20, 70, 20);
  511. flexAttributesBorderPanel.add(flexCooldownLabel);
  512. JFormattedTextField cooldownTextField = new JFormattedTextField(moreThenZeroIntegerFormater);
  513. cooldownTextField.setValue(intermediateFlex.getCooldown());
  514. cooldownTextField.setToolTipText("Only positive Integer.");
  515. cooldownTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setCooldown(Integer.parseInt(cooldownTextField.getValue().toString())));
  516. cooldownTextField.setBounds(380, 15, 200, 30);
  517. flexAttributesBorderPanel.add(cooldownTextField);
  518. JCheckBox offeredCheckBox = new JCheckBox("Offered");
  519. offeredCheckBox.setSelected(this.offered);
  520. offeredCheckBox.setBounds(310, 55, 200, 20);
  521. flexAttributesBorderPanel.add(offeredCheckBox);
  522. JCheckBox onConstrainCheckBox = new JCheckBox("On_Constrain");
  523. onConstrainCheckBox.setSelected(this.onConstrain);
  524. onConstrainCheckBox.setBounds(310, 80, 200, 20);
  525. flexAttributesBorderPanel.add(onConstrainCheckBox);
  526. JCheckBox offConstrainCheckBox = new JCheckBox("Off_Constrain");
  527. offConstrainCheckBox.setSelected(this.offConstrain);
  528. offConstrainCheckBox.setBounds(310, 105, 200, 20);
  529. flexAttributesBorderPanel.add(offConstrainCheckBox);
  530. //Both cant be true....
  531. onConstrainCheckBox.addActionListener(clicked -> {
  532. if(onConstrainCheckBox.isSelected()) offConstrainCheckBox.setSelected(false);
  533. });
  534. offConstrainCheckBox.addActionListener(clicked -> {
  535. if(offConstrainCheckBox.isSelected()) onConstrainCheckBox.setSelected(false);
  536. });
  537. JButton createFlexButton = new JButton("Create");
  538. createFlexButton.addActionListener(clicked -> {
  539. //createFlexButton.requestFocus();
  540. //createFlexButton.grabFocus();
  541. HolonElement ele;
  542. if(element ==null) {
  543. ele = (HolonElement) holonElementSelector.getSelectedItem();
  544. }else {
  545. ele = element;
  546. }
  547. Flexibility toCreateFlex = new Flexibility(ele);
  548. toCreateFlex.name = intermediateFlex.name;
  549. toCreateFlex.speed = intermediateFlex.speed;
  550. toCreateFlex.setDuration(intermediateFlex.getDuration());
  551. toCreateFlex.cost = intermediateFlex.cost;
  552. toCreateFlex.setCooldown(intermediateFlex.getCooldown());
  553. toCreateFlex.offered=offeredCheckBox.isSelected();
  554. if(onConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOnConstrain());
  555. if(offConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOffConstrain());
  556. ele.flexList.add(toCreateFlex);
  557. //save checkboxes
  558. this.offered=offeredCheckBox.isSelected();
  559. this.onConstrain = onConstrainCheckBox.isSelected();
  560. this.offConstrain = offConstrainCheckBox.isSelected();
  561. //if(!model.getSelectedCpsObjects().contains(holonObjectSelector.getSelectedItem()))model.getSelectedCpsObjects().add((AbstractCpsObject)holonObjectSelector.getSelectedItem());
  562. controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
  563. update();
  564. addDialog.dispose();
  565. });
  566. buttonPanel.add(createFlexButton);
  567. JButton cancelButton = new JButton("Cancel");
  568. cancelButton.addActionListener(clicked -> {
  569. addDialog.dispose();
  570. });
  571. buttonPanel.add(cancelButton);
  572. //last
  573. addDialog.setLocationRelativeTo(this);
  574. addDialog.setVisible(true);
  575. }
  576. class ElementInfo {
  577. HolonElement ele;
  578. public ElementInfo(HolonElement ele) {
  579. this.ele = ele;
  580. }
  581. @Override
  582. public String toString() {
  583. return ele.getName() + " Priority:" + ele.getPriority();
  584. }
  585. }
  586. public Color FlexStateToColor(FlexState state) {
  587. switch(state) {
  588. case IN_USE:
  589. return new Color(173,247,182);
  590. case NOT_OFFERED:
  591. return new Color(252,245,199);
  592. case OFFERED:
  593. return new Color(160,206,217);
  594. case ON_COOLDOWN:
  595. return new Color(255,238,147);
  596. case UNAVAILABLE:
  597. default:
  598. return new Color(255,192,159);
  599. }
  600. }
  601. }