SettingsWindow.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package holeg.ui;
  2. import holeg.PowerFlowSettings;
  3. import holeg.SlackNodePlacementStrategy;
  4. import javax.swing.*;
  5. import javax.swing.event.ChangeListener;
  6. import java.awt.*;
  7. import java.util.function.Consumer;
  8. public class SettingsWindow extends JDialog {
  9. public SettingsWindow(Frame owner, PowerFlowSettings settings) {
  10. super(owner);
  11. setTitle("HOLEG: Power flow settings");
  12. setSize(400, 600);
  13. getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
  14. createCheckbox("Only update grid when changed", settings.onlyUpdateGridWhenChanged, (e) -> {
  15. settings.onlyUpdateGridWhenChanged = e;
  16. });
  17. createCheckbox("Wait for solver job", settings.waitForSolverJob, (e) -> {
  18. settings.waitForSolverJob = e;
  19. });
  20. createCheckbox("Skip grids with no producers", settings.skipGridsWithNoProducers, (e) -> {
  21. settings.skipGridsWithNoProducers = e;
  22. });
  23. createCheckbox("Replace node with slack node", settings.replaceNodeWithSlackNode, (e) -> {
  24. settings.replaceNodeWithSlackNode = e;
  25. });
  26. createComboBox("Slack node placement strategy", SlackNodePlacementStrategy.values(), settings.slackNodePlacementStrategy, (e) -> {
  27. settings.slackNodePlacementStrategy = e;
  28. });
  29. createNumberTextBox("Solver threads per subgrid", settings.maxSolverThreads, (e) -> {
  30. settings.maxSolverThreads = e;
  31. });
  32. createNumberTextBox("Max iterations", settings.solverSettings.maxIterations, (e) -> {
  33. settings.solverSettings.maxIterations = e;
  34. });
  35. createNumberTextBox("Min error", settings.solverSettings.minError, (e) -> {
  36. settings.solverSettings.minError = e;
  37. });
  38. createNumberTextBox("Max error", settings.solverSettings.maxError, (e) -> {
  39. settings.solverSettings.maxError = e;
  40. });
  41. createNumberTextBox("Jacobian recalculation interval", settings.solverSettings.jacobianRecalculationInterval, (e) -> {
  42. settings.solverSettings.jacobianRecalculationInterval = e;
  43. });
  44. createNumberTextBox("Min voltage until invalid", settings.minVoltageUntilInvalid, (e) -> {
  45. settings.minVoltageUntilInvalid = e;
  46. });
  47. createCheckbox("Disable automatic scaling", settings.disableAutomaticScaling, (e) -> {
  48. settings.disableAutomaticScaling = e;
  49. });
  50. }
  51. private void createCheckbox(String label, boolean value, Consumer<Boolean> listener) {
  52. JCheckBox checkbox = new JCheckBox();
  53. checkbox.setText(label);
  54. checkbox.setSelected(value);
  55. checkbox.setAlignmentX(Component.LEFT_ALIGNMENT);
  56. checkbox.addActionListener((e) -> {
  57. if (listener != null)
  58. listener.accept(((JCheckBox) e.getSource()).isSelected());
  59. });
  60. add(checkbox);
  61. }
  62. private <T> void createComboBox(String label, T[] choices, T value, Consumer<T> listener) {
  63. Container container = new Container();
  64. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  65. // Add label
  66. container.add(new JLabel(label));
  67. // Create combo box
  68. JComboBox<T> comboBox = new JComboBox<T>(choices);
  69. comboBox.setSelectedItem(value);
  70. comboBox.setMaximumSize(comboBox.getPreferredSize());
  71. comboBox.setAlignmentX(Component.LEFT_ALIGNMENT);
  72. comboBox.addActionListener((e) -> {
  73. if (listener != null)
  74. listener.accept((T) ((JComboBox<T>) e.getSource()).getSelectedItem());
  75. });
  76. container.add(comboBox);
  77. add(container);
  78. }
  79. private JTextField createTextField(String value) {
  80. JTextField textField = new JTextField();
  81. textField.setColumns(8);
  82. textField.setText(value);
  83. textField.setMaximumSize(textField.getPreferredSize());
  84. textField.setAlignmentX(Component.LEFT_ALIGNMENT);
  85. return textField;
  86. }
  87. private void createNumberTextBox(String label, Integer value, Consumer<Integer> listener) {
  88. Container container = new Container();
  89. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  90. // Add label
  91. container.add(new JLabel(label));
  92. // Create text field
  93. JTextField textField = createTextField(Integer.toString(value));
  94. textField.getDocument().addDocumentListener((SimpleDocumentListener)(e) -> {
  95. if (listener != null) {
  96. String text = textField.getText();
  97. try {
  98. listener.accept(Integer.parseInt(text));
  99. }
  100. catch(NumberFormatException ignored) {
  101. }
  102. }
  103. });
  104. container.add(textField);
  105. add(container);
  106. }
  107. private void createNumberTextBox(String label, Double value, Consumer<Double> listener) {
  108. Container container = new Container();
  109. container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
  110. // Add label
  111. container.add(new JLabel(label));
  112. // Create text field
  113. JTextField textField = createTextField(Double.toString(value));
  114. textField.getDocument().addDocumentListener((SimpleDocumentListener)(e) -> {
  115. if (listener != null) {
  116. String text = textField.getText();
  117. try {
  118. listener.accept(Double.parseDouble(text));
  119. }
  120. catch(NumberFormatException ignored) {
  121. }
  122. }
  123. });
  124. container.add(textField);
  125. add(container);
  126. }
  127. }