Inspector.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.GridLayout;
  6. import java.util.ArrayList;
  7. import java.util.Collection;
  8. import java.util.List;
  9. import java.util.stream.Collectors;
  10. import javax.swing.BorderFactory;
  11. import javax.swing.BoxLayout;
  12. import javax.swing.ImageIcon;
  13. import javax.swing.JButton;
  14. import javax.swing.JCheckBox;
  15. import javax.swing.JComboBox;
  16. import javax.swing.JFormattedTextField;
  17. import javax.swing.JLabel;
  18. import javax.swing.JPanel;
  19. import javax.swing.JTextField;
  20. import javax.swing.UIManager;
  21. import javax.swing.border.Border;
  22. import classes.AbstractCanvasObject;
  23. import classes.HolonElement;
  24. import classes.HolonElement.Priority;
  25. import classes.HolonObject;
  26. import ui.controller.Control;
  27. import ui.view.util.TrippleCheckBox;
  28. import utility.ImageImport;
  29. import utility.events.SimpleDocumentListener;
  30. public class Inspector extends JPanel {
  31. private List<HolonElement> elements = new ArrayList<>();
  32. private Control control;
  33. private final int columnHeight = 19;
  34. private final Inspector self;
  35. private final ImageIcon deleteElementIcon = new ImageIcon(ImageImport.loadImage("Images/minus.png", 13, 13));
  36. private final ImageIcon addElementIcon = new ImageIcon(ImageImport.loadImage("Images/plus.png", 13, 13));
  37. private final Color selectedColor = new Color(126, 186, 255);
  38. Inspector(Control control) {
  39. control.OnSelectionChanged.addListener(() -> update_ui());
  40. this.control = control;
  41. UIManager.put("Spinner.editorAlignment", JTextField.LEFT);
  42. initUI();
  43. this.add(header());
  44. self = this;
  45. }
  46. public void update_ui() {
  47. System.out.println("update_ui");
  48. elements = extractElements(control.getModel().getSelectedObjects());
  49. // TODO Pooling
  50. this.removeAll();
  51. this.add(header());
  52. for (HolonElement element : elements) {
  53. this.add(new ElementEdit(element));
  54. }
  55. if(!elements.isEmpty()) {
  56. this.add(generateAddElementButton(elements.stream().findFirst().get()));
  57. }
  58. revalidate();
  59. repaint();
  60. }
  61. private void initUI() {
  62. this.setBackground(Color.white);
  63. this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
  64. }
  65. private JPanel header() {
  66. JPanel header = new JPanel(new GridLayout(1,7));
  67. header.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
  68. header.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
  69. JPanel selectionPanel = new JPanel();
  70. selectionPanel.setLayout(new BoxLayout(selectionPanel, BoxLayout.LINE_AXIS));
  71. //Delete Button
  72. JButton deleteButton = new JButton();
  73. deleteButton.setIcon(deleteElementIcon);
  74. deleteButton.setBorder(generateButtonHeaderBorder());
  75. deleteButton.setContentAreaFilled(false);
  76. deleteButton.setFocusPainted(false);
  77. deleteButton.setToolTipText(
  78. "<html><b>Remove this element</b><br>Removes this HolonElement from the HolonObject.</html>");
  79. deleteButton.addActionListener(clicked ->{
  80. System.out.println("hello");
  81. });
  82. JButton addButton = new JButton();
  83. addButton.setIcon(addElementIcon);
  84. addButton.setBorder(generateButtonHeaderBorder());
  85. addButton.setContentAreaFilled(false);
  86. addButton.setFocusPainted(false);
  87. TrippleCheckBox selectAllCheckBox = new TrippleCheckBox();
  88. selectAllCheckBox.setBorder(generateButtonHeaderBorder());
  89. selectionPanel.add(selectAllCheckBox);
  90. selectionPanel.add(deleteButton, BorderLayout.LINE_END);
  91. selectionPanel.add(addButton);
  92. header.add(selectionPanel);
  93. //Populate
  94. String[] headerCoulumnTitles = {"Object", "Nr.", "Device", "Energy", "Priority", "Activ"};
  95. for(String coulumnTitle : headerCoulumnTitles) {
  96. header.add(generateHeaderColumnTitle(coulumnTitle));
  97. }
  98. return header;
  99. }
  100. private JLabel generateHeaderColumnTitle(String string) {
  101. JLabel columnTitleLabel = new JLabel(string);
  102. columnTitleLabel.setToolTipText(string);
  103. columnTitleLabel.setBorder(generateHeaderBorder());
  104. return columnTitleLabel;
  105. }
  106. private JPanel generateAddElementButton(HolonElement element) {
  107. JPanel panel = new JPanel(new BorderLayout());
  108. panel.setBorder(generateTableBorder());
  109. panel.setBackground(Color.white);
  110. panel.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
  111. panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
  112. JButton button = new JButton();
  113. button.setIcon(addElementIcon);
  114. button.setBorder(null);
  115. button.setBackground(Color.white);
  116. button.addActionListener(clicked -> {
  117. element.parentObject.addElement(new HolonElement(element));
  118. update_ui();
  119. });
  120. panel.add(button, BorderLayout.CENTER);
  121. return panel;
  122. }
  123. private List<HolonElement> extractElements(Collection<AbstractCanvasObject> toInspect) {
  124. // Extract elements from a list of AbstractCanvasObjects
  125. return toInspect.stream().filter(obj -> obj instanceof HolonObject).flatMap(obj -> {
  126. HolonObject ho = (HolonObject) obj;
  127. return ho.getElements().stream();
  128. }).collect(Collectors.toList());
  129. }
  130. private Border generateTableBorder() {
  131. return BorderFactory.createMatteBorder(1, 1, 0, 0, Color.LIGHT_GRAY);
  132. }
  133. private Border generateHeaderBorder() {
  134. return BorderFactory.createEmptyBorder(1, 2, 0, 0);
  135. }
  136. private Border generateButtonHeaderBorder() {
  137. return BorderFactory.createEmptyBorder(2, 2, 0, 0);
  138. }
  139. private class ElementEdit extends JPanel {
  140. HolonElement element;
  141. ElementEdit(HolonElement element) {
  142. this.element = element;
  143. this.initUI();
  144. this.createEditFields();
  145. }
  146. private void initUI() {
  147. this.setBackground(Color.white);
  148. this.setLayout(new GridLayout(1, 7));
  149. this.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
  150. this.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
  151. }
  152. private void createEditFields(){
  153. //Selected
  154. JPanel selectedColumnPanel = new JPanel(new BorderLayout());
  155. selectedColumnPanel.setBorder(generateTableBorder());
  156. selectedColumnPanel.setOpaque(false);
  157. this.add(selectedColumnPanel);
  158. JCheckBox selected = new JCheckBox();
  159. selected.setBorder(generateTableBorder());
  160. selected.setOpaque(false);
  161. selected.addActionListener(clicked -> {
  162. this.setBackground(selected.isSelected() ? selectedColor : Color.white);
  163. });
  164. selectedColumnPanel.add(selected, BorderLayout.CENTER);
  165. //ObjectName and ID
  166. JPanel objectNamePanel = new JPanel(new BorderLayout());
  167. JTextField objectNameTextField = new JTextField(this.element.parentObject.getName());
  168. objectNameTextField.setBorder(generateTableBorder());
  169. objectNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
  170. this.element.parentObject.setName(objectNameTextField.getText());
  171. });
  172. objectNameTextField.setOpaque(false);
  173. objectNameTextField.setBorder(BorderFactory.createEmptyBorder());
  174. objectNameTextField.addActionListener(ae -> update_ui());
  175. JLabel idLabel = new JLabel("[" + this.element.parentObject.getId() + "]");
  176. objectNamePanel.add(objectNameTextField, BorderLayout.CENTER);
  177. objectNamePanel.setBorder(generateTableBorder());
  178. objectNamePanel.add(idLabel, BorderLayout.LINE_END);
  179. objectNamePanel.setOpaque(false);
  180. idLabel.setForeground(Color.gray);
  181. idLabel.setToolTipText("HolonObject's ID");
  182. this.add(objectNamePanel);
  183. //Id
  184. JLabel idTextField = new JLabel(Integer.toString(this.element.getId()));
  185. idTextField.setBorder(generateTableBorder());
  186. this.add(idTextField);
  187. //Name
  188. JTextField elementNameTextField = new JTextField(this.element.getEleName());
  189. elementNameTextField.setBorder(generateTableBorder());
  190. elementNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
  191. this.element.setEleName(elementNameTextField.getText());
  192. });
  193. elementNameTextField.setOpaque(false);
  194. this.add(elementNameTextField);
  195. // Energy
  196. JFormattedTextField energyTextField = new JFormattedTextField();
  197. energyTextField.setValue(this.element.getEnergy());
  198. energyTextField.setOpaque(false);
  199. energyTextField.addPropertyChangeListener(actionEvent -> {
  200. float energy = (float)energyTextField.getValue();
  201. if(this.element.getEnergy() != energy) {
  202. this.element.setEnergyPerElement(energy);
  203. control.calculateStateAndVisualForCurrentTimeStep();
  204. }
  205. });
  206. energyTextField.setBorder(generateTableBorder());
  207. this.add(energyTextField);
  208. //Priority
  209. JComboBox<Priority> comboBox = new JComboBox<Priority>(Priority.values());
  210. comboBox.setSelectedItem(this.element.getPriority());
  211. comboBox.setOpaque(false);
  212. comboBox.setBorder(generateTableBorder());
  213. comboBox.setEditable(false);
  214. comboBox.addActionListener(ae -> {
  215. this.element.setPriority((Priority)comboBox.getSelectedItem());
  216. });
  217. this.add(comboBox);
  218. //Active Delete Column
  219. JPanel checkBoxWrapperPanel = new JPanel(new BorderLayout());
  220. checkBoxWrapperPanel.setBorder(generateTableBorder());
  221. checkBoxWrapperPanel.setOpaque(false);
  222. this.add(checkBoxWrapperPanel);
  223. // Active
  224. JCheckBox checkbox = new JCheckBox();
  225. checkbox.setSelected(this.element.isActive());
  226. checkbox.setOpaque(false);
  227. checkbox.addActionListener(actionEvent -> {
  228. this.element.setActive(checkbox.isSelected());
  229. control.calculateStateAndVisualForCurrentTimeStep();
  230. });
  231. checkBoxWrapperPanel.add(checkbox, BorderLayout.LINE_START);
  232. }
  233. }
  234. }