FlexWindow.java 24 KB

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