FlexWindow.java 24 KB

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