|
@@ -4,9 +4,13 @@ import java.awt.BorderLayout;
|
|
|
import java.awt.Color;
|
|
|
import java.awt.Container;
|
|
|
import java.awt.Dimension;
|
|
|
+import java.awt.event.ActionEvent;
|
|
|
+import java.awt.event.InputEvent;
|
|
|
+import java.awt.event.KeyEvent;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.NumberFormat;
|
|
|
import java.util.Collection;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
@@ -14,6 +18,9 @@ import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
+import java.util.ArrayList;
|
|
|
+
|
|
|
+import javax.swing.AbstractAction;
|
|
|
import javax.swing.BorderFactory;
|
|
|
import javax.swing.Box;
|
|
|
import javax.swing.BoxLayout;
|
|
@@ -25,6 +32,8 @@ import javax.swing.JFormattedTextField;
|
|
|
import javax.swing.JLabel;
|
|
|
import javax.swing.JPanel;
|
|
|
import javax.swing.JTextField;
|
|
|
+import javax.swing.KeyStroke;
|
|
|
+import javax.swing.SwingConstants;
|
|
|
import javax.swing.text.NumberFormatter;
|
|
|
|
|
|
import classes.AbstractCanvasObject;
|
|
@@ -48,44 +57,106 @@ public class InspectorTable extends JPanel {
|
|
|
return new ElementRow();
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
- private final int maxDisplayedRowsNumber = 1000;
|
|
|
-
|
|
|
+
|
|
|
+ private final int maxDisplayedRowsNumber = 100;
|
|
|
+ private int actualPage = 0;
|
|
|
+ private int maxPageNumberForThisSelection = 0;
|
|
|
private Control control;
|
|
|
private final int columnHeight = 20;
|
|
|
- //UI
|
|
|
+ // UI
|
|
|
private final TrippleCheckBox selectAllCheckBox = new TrippleCheckBox();
|
|
|
private final JButton addButton = new JButton();
|
|
|
private final JButton duplicateButton = new JButton();
|
|
|
private final JButton deleteButton = new JButton();
|
|
|
private final JPanel buttonPanel = new JPanel();
|
|
|
+
|
|
|
+ private final JButton pageIncreaseButton = new JButton();
|
|
|
+ private final JButton pageDecreaseButton = new JButton();
|
|
|
+ private final JLabel pageInformationLabel = new JLabel();
|
|
|
+ private final JPanel pageSelectionPanel = new JPanel();
|
|
|
+ private ArrayList<SortButton<ElementRow>> headerButtonList = new ArrayList<>();
|
|
|
private final static NumberFormatter doubleFormatter = generateNumberFormatter();
|
|
|
+
|
|
|
+ //sorting
|
|
|
+ private Comparator<ElementRow> actual_comp = (ElementRow a, ElementRow b) -> Float.compare(a.element.getEnergy(), b.element.getEnergy());
|
|
|
|
|
|
- //Colors
|
|
|
+ // Colors
|
|
|
private final static Color selectedColor = new Color(126, 186, 255);
|
|
|
private final static Color borderColor = new Color(171, 173, 179);
|
|
|
- //Events
|
|
|
+ // Events
|
|
|
public Action<Set<HolonElement>> OnElementSelectionChanged = new Action<>();
|
|
|
- private Thread populateRowsThread;
|
|
|
+ private Thread populateRowsThread;
|
|
|
private boolean abortThread = false;
|
|
|
+
|
|
|
public InspectorTable(Control control) {
|
|
|
- control.OnSelectionChanged.addListener(() -> update_ui());
|
|
|
+ control.OnSelectionChanged.addListener(() -> updateInspectorUi());
|
|
|
this.control = control;
|
|
|
init();
|
|
|
- generateHeader();
|
|
|
+ addHeader();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
private void init() {
|
|
|
MigLayout layout = new MigLayout("insets 0,gap 0,wrap 7", // Layout Constraints
|
|
|
"[][fill, grow][fill][fill, grow][fill, grow][][fill]", // Column constraints
|
|
|
"[25!][20:20:20]"); // Row constraints
|
|
|
this.setLayout(layout);
|
|
|
initSelectAllCheckBox();
|
|
|
- initButtonPanel();
|
|
|
+ initButtons();
|
|
|
+ initKeyControls();
|
|
|
+ initHeaderButtons();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void initKeyControls() {
|
|
|
+ this.getInputMap(WHEN_IN_FOCUSED_WINDOW)
|
|
|
+ .put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.ALT_DOWN_MASK), "PageRight");
|
|
|
+ this.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.ALT_DOWN_MASK),
|
|
|
+ "PageLeft");
|
|
|
+
|
|
|
+ this.getActionMap().put("PageRight", new AbstractAction() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ performPageAction(PageAction.Increase);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ this.getActionMap().put("PageLeft", new AbstractAction() {
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ performPageAction(PageAction.Decrease);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private enum PageAction {
|
|
|
+ Increase, Decrease
|
|
|
+ };
|
|
|
+
|
|
|
+ private void performPageAction(PageAction action) {
|
|
|
+ int newPageNumber;
|
|
|
+ switch (action) {
|
|
|
+ case Decrease:
|
|
|
+ newPageNumber = Math.max(actualPage - 1, 0);
|
|
|
+ break;
|
|
|
+ case Increase:
|
|
|
+ default:
|
|
|
+ newPageNumber = Math.min(actualPage + 1, maxPageNumberForThisSelection);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (newPageNumber != actualPage) {
|
|
|
+ actualPage = newPageNumber;
|
|
|
+ updateTableUi();
|
|
|
+ updatePageButtonAppearance();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updatePageButtonAppearance() {
|
|
|
+ this.pageDecreaseButton.setEnabled(actualPage != 0);
|
|
|
+ this.pageIncreaseButton.setEnabled(actualPage != maxPageNumberForThisSelection);
|
|
|
}
|
|
|
+
|
|
|
private static NumberFormatter generateNumberFormatter() {
|
|
|
NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
|
|
|
doubleFormat.setMinimumFractionDigits(1);
|
|
@@ -98,15 +169,29 @@ public class InspectorTable extends JPanel {
|
|
|
return doubleFormatter;
|
|
|
}
|
|
|
|
|
|
- private void generateHeader() {
|
|
|
-
|
|
|
+ private void initHeaderButtons() {
|
|
|
+ Comparator<ElementRow> objectComp = (ElementRow a, ElementRow b) -> a.element.parentObject.getName().compareTo(b.element.parentObject.getName());
|
|
|
+ Comparator<ElementRow> idComp = (ElementRow a, ElementRow b) -> Integer.compare(a.element.parentObject.getId(), b.element.parentObject.getId());
|
|
|
+ Comparator<ElementRow> deviceComp = (ElementRow a, ElementRow b) -> a.element.getName().compareTo(b.element.getName());
|
|
|
+ Comparator<ElementRow> energyComp = (ElementRow a, ElementRow b) -> Float.compare(a.element.getEnergy(), b.element.getEnergy());
|
|
|
+ Comparator<ElementRow> priorityComp = (ElementRow a, ElementRow b) -> a.element.getPriority().compareTo(b.element.getPriority());
|
|
|
+ Comparator<ElementRow> activeComp = (ElementRow a, ElementRow b) -> Boolean.compare(a.element.isActive(), b.element.isActive());
|
|
|
+;
|
|
|
+
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Object", objectComp));
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Id", idComp));
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Device", deviceComp));
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Energy", energyComp));
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Priority", priorityComp));
|
|
|
+ headerButtonList.add(new SortButton<ElementRow>("Activ", activeComp));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void addHeader() {
|
|
|
this.add(selectAllCheckBox);
|
|
|
- this.add(generateHeaderColumnTitle("Object"));
|
|
|
- this.add(generateHeaderColumnTitle("Id "));
|
|
|
- this.add(generateHeaderColumnTitle("Device"));
|
|
|
- this.add(generateHeaderColumnTitle("Energy"));
|
|
|
- this.add(generateHeaderColumnTitle("Priority"));
|
|
|
- this.add(generateHeaderColumnTitle("Activ"));
|
|
|
+ for(SortButton<ElementRow> button : headerButtonList) {
|
|
|
+ this.add(button);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private void initSelectAllCheckBox() {
|
|
@@ -123,7 +208,8 @@ public class InspectorTable extends JPanel {
|
|
|
}
|
|
|
break;
|
|
|
case unselected:
|
|
|
- if(rowPool.getBorrowedCount() == 0) {
|
|
|
+ // TODO maybe select only current page
|
|
|
+ if (rowPool.getBorrowedCount() != 0) {
|
|
|
rowPool.getBorrowedStream().forEach(row -> row.setSelected(true));
|
|
|
duplicateButton.setEnabled(true);
|
|
|
deleteButton.setEnabled(true);
|
|
@@ -134,16 +220,8 @@ public class InspectorTable extends JPanel {
|
|
|
updateElementSelection();
|
|
|
});
|
|
|
}
|
|
|
- private JLabel generateHeaderColumnTitle(String string) {
|
|
|
- JLabel columnTitleLabel = new JLabel(string);
|
|
|
- columnTitleLabel.setToolTipText(string);
|
|
|
- columnTitleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
- return columnTitleLabel;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- private void initButtonPanel() {
|
|
|
+
|
|
|
+ private void initButtons() {
|
|
|
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
|
|
|
buttonPanel.add(Box.createRigidArea(new Dimension(2, 0)));
|
|
|
|
|
@@ -156,7 +234,7 @@ public class InspectorTable extends JPanel {
|
|
|
last.ifPresent(obj -> {
|
|
|
obj.addElement(new HolonElement(obj, "Element", 0.0f));
|
|
|
control.calculateStateAndVisualForCurrentTimeStep();
|
|
|
- update_ui();
|
|
|
+ updateInspectorUi();
|
|
|
});
|
|
|
});
|
|
|
buttonPanel.add(addButton);
|
|
@@ -165,12 +243,12 @@ public class InspectorTable extends JPanel {
|
|
|
duplicateButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
duplicateButton.addActionListener(clicked -> {
|
|
|
rowPool.getBorrowedStream().forEach(row -> {
|
|
|
- if(row.isSelected()) {
|
|
|
+ if (row.isSelected()) {
|
|
|
row.element.parentObject.addElement(new HolonElement(row.element));
|
|
|
}
|
|
|
});
|
|
|
control.calculateStateAndVisualForCurrentTimeStep();
|
|
|
- update_ui();
|
|
|
+ updateInspectorUi();
|
|
|
});
|
|
|
buttonPanel.add(duplicateButton);
|
|
|
|
|
@@ -178,55 +256,77 @@ public class InspectorTable extends JPanel {
|
|
|
deleteButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
deleteButton.addActionListener(clicked -> {
|
|
|
rowPool.getBorrowedStream().forEach(row -> {
|
|
|
- if(row.isSelected()) {
|
|
|
+ if (row.isSelected()) {
|
|
|
row.element.parentObject.removeElement(row.element);
|
|
|
}
|
|
|
});
|
|
|
control.calculateStateAndVisualForCurrentTimeStep();
|
|
|
- update_ui();
|
|
|
+ updateInspectorUi();
|
|
|
});
|
|
|
buttonPanel.add(deleteButton);
|
|
|
+
|
|
|
+ pageIncreaseButton.setIcon(new ImageIcon(ImageImport.loadImage("Images/page_increase.png", 16, 16)));
|
|
|
+ ;
|
|
|
+ pageIncreaseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
+ pageIncreaseButton.addActionListener(clicked -> this.performPageAction(PageAction.Increase));
|
|
|
+
|
|
|
+ pageDecreaseButton.setIcon(new ImageIcon(ImageImport.loadImage("Images/page_decrease.png", 16, 16)));
|
|
|
+ pageDecreaseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
+ pageDecreaseButton.addActionListener(clicked -> this.performPageAction(PageAction.Decrease));
|
|
|
+
|
|
|
+ pageInformationLabel.setForeground(Color.gray);
|
|
|
+
|
|
|
+ pageSelectionPanel.setLayout(new BoxLayout(pageSelectionPanel, BoxLayout.LINE_AXIS));
|
|
|
+ pageSelectionPanel.add(Box.createRigidArea(new Dimension(2, 0)));
|
|
|
+ pageSelectionPanel.add(this.pageInformationLabel);
|
|
|
+ pageSelectionPanel.add(Box.createHorizontalGlue());
|
|
|
+ pageSelectionPanel.add(this.pageDecreaseButton);
|
|
|
+ pageSelectionPanel.add(this.pageIncreaseButton);
|
|
|
}
|
|
|
|
|
|
- private void update_ui() {
|
|
|
-
|
|
|
- if(populateRowsThread != null) {
|
|
|
+ private void assignElementsToRowPool(Set<AbstractCanvasObject> selection) {
|
|
|
+ List<HolonElement> elementList = extractElements(selection).toList();
|
|
|
+ rowPool.clear();
|
|
|
+ for (HolonElement element : elementList) {
|
|
|
+ ElementRow row = rowPool.get();
|
|
|
+ row.setElement(element);
|
|
|
+ }
|
|
|
+ actualPage = 0;
|
|
|
+ this.maxPageNumberForThisSelection = elementList.size() / this.maxDisplayedRowsNumber;
|
|
|
+ updatePageButtonAppearance();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateTableUi() {
|
|
|
+
|
|
|
+ // Maybe abort current thread and join them
|
|
|
+ if (populateRowsThread != null) {
|
|
|
try {
|
|
|
abortThread = true;
|
|
|
populateRowsThread.join();
|
|
|
+ populateRowsThread.join();
|
|
|
abortThread = false;
|
|
|
} catch (InterruptedException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
- //clone for concurrency
|
|
|
- Set<AbstractCanvasObject> selection = new HashSet<>(control.getModel().getSelectedObjects());
|
|
|
populateRowsThread = new Thread(() -> {
|
|
|
- // time passes
|
|
|
- List<HolonElement> elementList = extractElements(selection).toList();
|
|
|
- int numberOfRows = elementList.size();
|
|
|
+ int numberOfRows = rowPool.getBorrowedCount();
|
|
|
this.removeAll();
|
|
|
- rowPool.clear();
|
|
|
- generateHeader();
|
|
|
- for(HolonElement element : elementList)
|
|
|
- {
|
|
|
- ElementRow row = rowPool.get();
|
|
|
- row.setElement(element);
|
|
|
+ addHeader();
|
|
|
+ rowPool.getBorrowedStream().sorted(actual_comp).skip(actualPage * maxDisplayedRowsNumber).limit(maxDisplayedRowsNumber)
|
|
|
+ .takeWhile(row -> !abortThread).forEach(row -> {
|
|
|
+ row.addContainerToInspector();
|
|
|
+ });
|
|
|
+ if (numberOfRows > maxDisplayedRowsNumber) {
|
|
|
+ int lastDisplayedElementNumber = Math.min(numberOfRows, (actualPage + 1) * maxDisplayedRowsNumber);
|
|
|
+ pageInformationLabel.setText(String.format("%d - %d from %d", 1 + actualPage * maxDisplayedRowsNumber,
|
|
|
+ lastDisplayedElementNumber, numberOfRows));
|
|
|
+ this.add(pageSelectionPanel, "span, grow");
|
|
|
}
|
|
|
- rowPool.getBorrowedStream().limit(maxDisplayedRowsNumber).takeWhile(row -> !abortThread).forEach(row -> {
|
|
|
- row.addContainerToInspector();
|
|
|
- });
|
|
|
- if(numberOfRows > maxDisplayedRowsNumber) {
|
|
|
- int remaining = elementList.size() - maxDisplayedRowsNumber;
|
|
|
- JLabel remainingLabel = new JLabel(remaining + " more...");
|
|
|
- remainingLabel.setForeground(Color.gray);
|
|
|
- this.add(remainingLabel, "span");
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
this.add(buttonPanel, "span");
|
|
|
- boolean isAtLeastOneHolonObjectSelected =
|
|
|
- control.getModel().getSelectedObjects().stream().anyMatch(object -> object instanceof HolonObject);
|
|
|
+ boolean isAtLeastOneHolonObjectSelected = control.getModel().getSelectedObjects().stream()
|
|
|
+ .anyMatch(object -> object instanceof HolonObject);
|
|
|
this.addButton.setEnabled(isAtLeastOneHolonObjectSelected);
|
|
|
duplicateButton.setEnabled(false);
|
|
|
deleteButton.setEnabled(false);
|
|
@@ -236,12 +336,19 @@ public class InspectorTable extends JPanel {
|
|
|
this.OnElementSelectionChanged.broadcast(new HashSet<HolonElement>());
|
|
|
});
|
|
|
populateRowsThread.start();
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+ private void updateInspectorUi() {
|
|
|
+ // clone for concurrency
|
|
|
+ Set<AbstractCanvasObject> selection = new HashSet<>(control.getModel().getSelectedObjects());
|
|
|
+ assignElementsToRowPool(selection);
|
|
|
+ updateTableUi();
|
|
|
+ }
|
|
|
|
|
|
private void updateElementSelection() {
|
|
|
- Set<HolonElement> eleSet = rowPool.getBorrowedStream().filter(ele -> ele.isSelected()).map(row -> row.element).collect(Collectors.toSet());
|
|
|
+ Set<HolonElement> eleSet = rowPool.getBorrowedStream().filter(ele -> ele.isSelected()).map(row -> row.element)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
this.OnElementSelectionChanged.broadcast(eleSet);
|
|
|
}
|
|
|
|
|
@@ -259,22 +366,20 @@ public class InspectorTable extends JPanel {
|
|
|
}
|
|
|
|
|
|
// Extract elements from a list of AbstractCanvasObjects
|
|
|
- static Stream<HolonElement> extractElements(Collection<AbstractCanvasObject> toInspect) {
|
|
|
- Stream<HolonElement> recursiveLayer = toInspect.stream().filter(object ->object instanceof GroupNode).flatMap(obj -> extractElements(((GroupNode)obj).getNodes()));
|
|
|
+ static Stream<HolonElement> extractElements(Collection<AbstractCanvasObject> toInspect) {
|
|
|
+ Stream<HolonElement> recursiveLayer = toInspect.stream().filter(object -> object instanceof GroupNode)
|
|
|
+ .flatMap(obj -> extractElements(((GroupNode) obj).getNodes()));
|
|
|
Stream<HolonElement> thisLayer = toInspect.stream().filter(obj -> obj instanceof HolonObject).flatMap(obj -> {
|
|
|
HolonObject ho = (HolonObject) obj;
|
|
|
return ho.getElements().stream();
|
|
|
});
|
|
|
return Stream.concat(thisLayer, recursiveLayer);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
private class ElementRow {
|
|
|
private HolonElement element = null;
|
|
|
private Container[] cellsInRow = new Container[7];
|
|
|
- //TextBoxes
|
|
|
+ // TextBoxes
|
|
|
private JTextField elementNameTextField;
|
|
|
private JCheckBox selectionBox;
|
|
|
private JTextField idObjectTextField;
|
|
@@ -282,9 +387,7 @@ public class InspectorTable extends JPanel {
|
|
|
private JComboBox<Priority> comboBox;
|
|
|
private JCheckBox activeCheckBox;
|
|
|
private JTextField objectNameTextField;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
public ElementRow() {
|
|
|
this.createEditFields();
|
|
|
}
|
|
@@ -312,15 +415,12 @@ public class InspectorTable extends JPanel {
|
|
|
selectionBox.setSelected(false);
|
|
|
objectNameTextField.setText(this.element.parentObject.getName());
|
|
|
idObjectTextField.setText(Integer.toString(this.element.parentObject.getId()));
|
|
|
- elementNameTextField.setText(this.element.getEleName());
|
|
|
+ elementNameTextField.setText(this.element.getName());
|
|
|
energyTextField.setValue(this.element.getEnergy());
|
|
|
comboBox.setSelectedItem(this.element.getPriority());
|
|
|
activeCheckBox.setSelected(this.element.isActive());
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
private void createEditFields() {
|
|
|
// Selected
|
|
|
JPanel selectedColumnPanel = new JPanel(new BorderLayout());
|
|
@@ -345,7 +445,7 @@ public class InspectorTable extends JPanel {
|
|
|
objectNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
|
|
|
this.element.parentObject.setName(objectNameTextField.getText());
|
|
|
});
|
|
|
- objectNameTextField.addActionListener(ae -> update_ui());
|
|
|
+ objectNameTextField.addActionListener(ae -> updateInspectorUi());
|
|
|
cellsInRow[1] = objectNameTextField;
|
|
|
idObjectTextField = new JTextField();
|
|
|
idObjectTextField.setMinimumSize(idObjectTextField.getPreferredSize());
|
|
@@ -364,7 +464,7 @@ public class InspectorTable extends JPanel {
|
|
|
|
|
|
energyTextField = new JFormattedTextField(doubleFormatter);
|
|
|
energyTextField.setInputVerifier(getInputVerifier());
|
|
|
-
|
|
|
+
|
|
|
energyTextField.setBackground(Color.white);
|
|
|
energyTextField.addPropertyChangeListener(actionEvent -> {
|
|
|
try {
|
|
@@ -393,7 +493,7 @@ public class InspectorTable extends JPanel {
|
|
|
checkBoxWrapperPanel.setBorder(BorderFactory.createLineBorder(borderColor));
|
|
|
checkBoxWrapperPanel.setBackground(Color.white);
|
|
|
checkBoxWrapperPanel.setMinimumSize(new Dimension(columnHeight, columnHeight));
|
|
|
- checkBoxWrapperPanel.setMaximumSize(new Dimension(columnHeight, columnHeight));
|
|
|
+ checkBoxWrapperPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
|
|
|
// Active
|
|
|
activeCheckBox = new JCheckBox();
|
|
|
activeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0));
|
|
@@ -407,4 +507,62 @@ public class InspectorTable extends JPanel {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ private enum SortState {
|
|
|
+ None, Descending, Ascending
|
|
|
+ };
|
|
|
+
|
|
|
+ private class SortButton<T> extends JButton {
|
|
|
+ private SortState state = SortState.None;
|
|
|
+ private Comparator<T> comp;
|
|
|
+
|
|
|
+ public SortButton(String text, Comparator<T> comp) {
|
|
|
+ super(text);
|
|
|
+ this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
|
|
|
+ this.setContentAreaFilled(false);
|
|
|
+ this.setBorderPainted(false);
|
|
|
+ this.setFocusPainted(false);
|
|
|
+ this.setHorizontalAlignment(SwingConstants.LEFT);
|
|
|
+ this.comp = comp;
|
|
|
+ this.addActionListener(onClick -> changeStateOnClick());
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private void changeStateOnClick() {
|
|
|
+ setState((this.state == SortState.Ascending) ? SortState.Descending : SortState.Ascending);
|
|
|
+ headerButtonList.stream().filter(button -> (button !=this)).forEach(button -> button.setState(SortState.None));
|
|
|
+ actual_comp = (Comparator<ElementRow>) getComp();
|
|
|
+ updateInspectorUi();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setState(SortState state) {
|
|
|
+ this.state = state;
|
|
|
+ String text = this.getText();
|
|
|
+ // remove order symbols from text
|
|
|
+ text = text.replaceAll("\u25bc|\u25b2", "");
|
|
|
+ // update text
|
|
|
+ switch (state) {
|
|
|
+ case Descending:
|
|
|
+ this.setText(text + "\u25bc");
|
|
|
+ break;
|
|
|
+ case Ascending:
|
|
|
+ this.setText(text + "\u25b2");
|
|
|
+ break;
|
|
|
+ case None:
|
|
|
+ default:
|
|
|
+ this.setText(text);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public Comparator<T> getComp(){
|
|
|
+ switch(state){
|
|
|
+ case Descending:
|
|
|
+ return comp.reversed();
|
|
|
+ case Ascending:
|
|
|
+ case None:
|
|
|
+ default:
|
|
|
+ return comp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|