123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- package ui.view;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.GridLayout;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.List;
- import java.util.stream.Collectors;
- import javax.swing.BorderFactory;
- import javax.swing.BoxLayout;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JCheckBox;
- import javax.swing.JComboBox;
- import javax.swing.JFormattedTextField;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.UIManager;
- import javax.swing.border.Border;
- import classes.AbstractCanvasObject;
- import classes.HolonElement;
- import classes.HolonElement.Priority;
- import classes.HolonObject;
- import ui.controller.Control;
- import ui.view.util.TrippleCheckBox;
- import utility.ImageImport;
- import utility.events.SimpleDocumentListener;
- public class Inspector extends JPanel {
- private List<HolonElement> elements = new ArrayList<>();
- private Control control;
- private final int columnHeight = 19;
- private final Inspector self;
- private final ImageIcon deleteElementIcon = new ImageIcon(ImageImport.loadImage("Images/minus.png", 13, 13));
- private final ImageIcon addElementIcon = new ImageIcon(ImageImport.loadImage("Images/plus.png", 13, 13));
- private final Color selectedColor = new Color(126, 186, 255);
-
- Inspector(Control control) {
- control.OnSelectionChanged.addListener(() -> update_ui());
- this.control = control;
- UIManager.put("Spinner.editorAlignment", JTextField.LEFT);
- initUI();
- this.add(header());
- self = this;
- }
- public void update_ui() {
- System.out.println("update_ui");
- elements = extractElements(control.getModel().getSelectedObjects());
- // TODO Pooling
- this.removeAll();
- this.add(header());
- for (HolonElement element : elements) {
- this.add(new ElementEdit(element));
- }
- if(!elements.isEmpty()) {
- this.add(generateAddElementButton(elements.stream().findFirst().get()));
- }
-
- revalidate();
- repaint();
- }
- private void initUI() {
- this.setBackground(Color.white);
- this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
-
- }
- private JPanel header() {
- JPanel header = new JPanel(new GridLayout(1,7));
- header.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
- header.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
- JPanel selectionPanel = new JPanel();
- selectionPanel.setLayout(new BoxLayout(selectionPanel, BoxLayout.LINE_AXIS));
- //Delete Button
- JButton deleteButton = new JButton();
- deleteButton.setIcon(deleteElementIcon);
- deleteButton.setBorder(generateButtonHeaderBorder());
- deleteButton.setContentAreaFilled(false);
- deleteButton.setFocusPainted(false);
- deleteButton.setToolTipText(
- "<html><b>Remove this element</b><br>Removes this HolonElement from the HolonObject.</html>");
- deleteButton.addActionListener(clicked ->{
- System.out.println("hello");
- });
-
- JButton addButton = new JButton();
- addButton.setIcon(addElementIcon);
- addButton.setBorder(generateButtonHeaderBorder());
- addButton.setContentAreaFilled(false);
- addButton.setFocusPainted(false);
- TrippleCheckBox selectAllCheckBox = new TrippleCheckBox();
- selectAllCheckBox.setBorder(generateButtonHeaderBorder());
- selectionPanel.add(selectAllCheckBox);
- selectionPanel.add(deleteButton, BorderLayout.LINE_END);
- selectionPanel.add(addButton);
- header.add(selectionPanel);
- //Populate
- String[] headerCoulumnTitles = {"Object", "Nr.", "Device", "Energy", "Priority", "Activ"};
- for(String coulumnTitle : headerCoulumnTitles) {
- header.add(generateHeaderColumnTitle(coulumnTitle));
- }
- return header;
- }
- private JLabel generateHeaderColumnTitle(String string) {
- JLabel columnTitleLabel = new JLabel(string);
- columnTitleLabel.setToolTipText(string);
- columnTitleLabel.setBorder(generateHeaderBorder());
- return columnTitleLabel;
- }
-
- private JPanel generateAddElementButton(HolonElement element) {
- JPanel panel = new JPanel(new BorderLayout());
- panel.setBorder(generateTableBorder());
- panel.setBackground(Color.white);
- panel.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
- panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
- JButton button = new JButton();
- button.setIcon(addElementIcon);
- button.setBorder(null);
- button.setBackground(Color.white);
- button.addActionListener(clicked -> {
- element.parentObject.addElement(new HolonElement(element));
- update_ui();
-
- });
- panel.add(button, BorderLayout.CENTER);
- return panel;
- }
-
- private List<HolonElement> extractElements(Collection<AbstractCanvasObject> toInspect) {
- // Extract elements from a list of AbstractCanvasObjects
- return toInspect.stream().filter(obj -> obj instanceof HolonObject).flatMap(obj -> {
- HolonObject ho = (HolonObject) obj;
- return ho.getElements().stream();
- }).collect(Collectors.toList());
- }
- private Border generateTableBorder() {
- return BorderFactory.createMatteBorder(1, 1, 0, 0, Color.LIGHT_GRAY);
- }
- private Border generateHeaderBorder() {
- return BorderFactory.createEmptyBorder(1, 2, 0, 0);
- }
- private Border generateButtonHeaderBorder() {
- return BorderFactory.createEmptyBorder(2, 2, 0, 0);
- }
- private class ElementEdit extends JPanel {
- HolonElement element;
- ElementEdit(HolonElement element) {
- this.element = element;
- this.initUI();
- this.createEditFields();
- }
-
- private void initUI() {
- this.setBackground(Color.white);
- this.setLayout(new GridLayout(1, 7));
- this.setMinimumSize(new Dimension(Integer.MIN_VALUE, columnHeight));
- this.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
- }
- private void createEditFields(){
- //Selected
- JPanel selectedColumnPanel = new JPanel(new BorderLayout());
- selectedColumnPanel.setBorder(generateTableBorder());
- selectedColumnPanel.setOpaque(false);
- this.add(selectedColumnPanel);
- JCheckBox selected = new JCheckBox();
- selected.setBorder(generateTableBorder());
- selected.setOpaque(false);
- selected.addActionListener(clicked -> {
- this.setBackground(selected.isSelected() ? selectedColor : Color.white);
- });
- selectedColumnPanel.add(selected, BorderLayout.CENTER);
-
- //ObjectName and ID
- JPanel objectNamePanel = new JPanel(new BorderLayout());
- JTextField objectNameTextField = new JTextField(this.element.parentObject.getName());
- objectNameTextField.setBorder(generateTableBorder());
- objectNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
- this.element.parentObject.setName(objectNameTextField.getText());
-
- });
- objectNameTextField.setOpaque(false);
- objectNameTextField.setBorder(BorderFactory.createEmptyBorder());
- objectNameTextField.addActionListener(ae -> update_ui());
-
- JLabel idLabel = new JLabel("[" + this.element.parentObject.getId() + "]");
- objectNamePanel.add(objectNameTextField, BorderLayout.CENTER);
- objectNamePanel.setBorder(generateTableBorder());
- objectNamePanel.add(idLabel, BorderLayout.LINE_END);
- objectNamePanel.setOpaque(false);
- idLabel.setForeground(Color.gray);
- idLabel.setToolTipText("HolonObject's ID");
- this.add(objectNamePanel);
- //Id
- JLabel idTextField = new JLabel(Integer.toString(this.element.getId()));
- idTextField.setBorder(generateTableBorder());
- this.add(idTextField);
-
- //Name
- JTextField elementNameTextField = new JTextField(this.element.getEleName());
- elementNameTextField.setBorder(generateTableBorder());
- elementNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
- this.element.setEleName(elementNameTextField.getText());
- });
- elementNameTextField.setOpaque(false);
- this.add(elementNameTextField);
- // Energy
- JFormattedTextField energyTextField = new JFormattedTextField();
- energyTextField.setValue(this.element.getEnergy());
- energyTextField.setOpaque(false);
- energyTextField.addPropertyChangeListener(actionEvent -> {
- float energy = (float)energyTextField.getValue();
- if(this.element.getEnergy() != energy) {
- this.element.setEnergyPerElement(energy);
- control.calculateStateAndVisualForCurrentTimeStep();
- }
- });
- energyTextField.setBorder(generateTableBorder());
- this.add(energyTextField);
-
- //Priority
- JComboBox<Priority> comboBox = new JComboBox<Priority>(Priority.values());
- comboBox.setSelectedItem(this.element.getPriority());
- comboBox.setOpaque(false);
- comboBox.setBorder(generateTableBorder());
- comboBox.setEditable(false);
- comboBox.addActionListener(ae -> {
- this.element.setPriority((Priority)comboBox.getSelectedItem());
- });
- this.add(comboBox);
- //Active Delete Column
-
- JPanel checkBoxWrapperPanel = new JPanel(new BorderLayout());
- checkBoxWrapperPanel.setBorder(generateTableBorder());
- checkBoxWrapperPanel.setOpaque(false);
- this.add(checkBoxWrapperPanel);
- // Active
- JCheckBox checkbox = new JCheckBox();
- checkbox.setSelected(this.element.isActive());
- checkbox.setOpaque(false);
- checkbox.addActionListener(actionEvent -> {
- this.element.setActive(checkbox.isSelected());
- control.calculateStateAndVisualForCurrentTimeStep();
- });
- checkBoxWrapperPanel.add(checkbox, BorderLayout.LINE_START);
-
-
-
- }
- }
- }
|