/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.examination.swingui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import org.optaplanner.examples.examination.domain.Examination;
import org.optaplanner.examples.examination.domain.InstitutionParametrization;
public class InstitutionParametrizationDialog extends JDialog {
protected final ExaminationPanel examinationPanel;
private JSpinner twoInARowPenaltyField;
private JSpinner twoInADayPenaltyField;
private JSpinner periodSpreadLengthField;
private JSpinner periodSpreadPenaltyField;
private JSpinner mixedDurationPenaltyField;
private JSpinner frontLoadLargeTopicSizeField;
private JSpinner frontLoadLastPeriodSizeField;
private JSpinner frontLoadPenaltyField;
protected final AbstractAction saveAction;
protected final AbstractAction cancelAction;
public InstitutionParametrizationDialog(Frame owner, ExaminationPanel examinationPanel) {
super(owner, "Edit institution score parametrization", true);
this.examinationPanel = examinationPanel;
JPanel contentPanel = new JPanel(new BorderLayout(5, 5));
contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
contentPanel.add(createFormPanel(), BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout());
saveAction = new AbstractAction("Save") {
@Override
public void actionPerformed(ActionEvent e) {
save();
}
};
buttonPanel.add(new JButton(saveAction));
cancelAction = new AbstractAction("Cancel") {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
};
buttonPanel.add(new JButton(cancelAction));
contentPanel.add(buttonPanel, BorderLayout.SOUTH);
setContentPane(contentPanel);
pack();
}
private JPanel createFormPanel() {
JPanel formPanel = new JPanel(new GridLayout(0, 2, 5, 5));
formPanel.add(new JLabel("2 exams in a row penalty"));
twoInARowPenaltyField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(twoInARowPenaltyField);
formPanel.add(new JLabel("2 exams in a day penalty"));
twoInADayPenaltyField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(twoInADayPenaltyField);
formPanel.add(new JLabel("Period spread length"));
periodSpreadLengthField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(periodSpreadLengthField);
formPanel.add(new JLabel("Period spread penalty"));
periodSpreadPenaltyField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(periodSpreadPenaltyField);
formPanel.add(new JLabel("Exams of mixed duration penalty"));
mixedDurationPenaltyField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(mixedDurationPenaltyField);
formPanel.add(new JLabel("Front load: large exam size"));
frontLoadLargeTopicSizeField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
frontLoadLargeTopicSizeField.setEnabled(false); // Not yet implemented: requires Topic changes if changed
formPanel.add(frontLoadLargeTopicSizeField);
formPanel.add(new JLabel("Front load: last period size"));
frontLoadLastPeriodSizeField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
frontLoadLastPeriodSizeField.setEnabled(false); // Not yet implemented: requires Period changes if changed
formPanel.add(frontLoadLastPeriodSizeField);
formPanel.add(new JLabel("Front load: penalty"));
frontLoadPenaltyField = new JSpinner(new SpinnerNumberModel(0, 0, null, 1));
formPanel.add(frontLoadPenaltyField);
return formPanel;
}
public void setInstitutionParametrization(InstitutionParametrization institutionParametrization) {
twoInARowPenaltyField.setValue(institutionParametrization.getTwoInARowPenalty());
twoInADayPenaltyField.setValue(institutionParametrization.getTwoInADayPenalty());
periodSpreadLengthField.setValue(institutionParametrization.getPeriodSpreadLength());
periodSpreadPenaltyField.setValue(institutionParametrization.getPeriodSpreadPenalty());
mixedDurationPenaltyField.setValue(institutionParametrization.getMixedDurationPenalty());
frontLoadLargeTopicSizeField.setValue(institutionParametrization.getFrontLoadLargeTopicSize());
frontLoadLastPeriodSizeField.setValue(institutionParametrization.getFrontLoadLastPeriodSize());
frontLoadPenaltyField.setValue(institutionParametrization.getFrontLoadPenalty());
setLocationRelativeTo(examinationPanel.getTopLevelAncestor());
}
private void save() {
final int twoInARowPenalty = (Integer) twoInARowPenaltyField.getValue();
final int twoInADayPenalty = (Integer) twoInADayPenaltyField.getValue();
final int periodSpreadLength = (Integer) periodSpreadLengthField.getValue();
final int periodSpreadPenalty = (Integer) periodSpreadPenaltyField.getValue();
final int mixedDurationPenalty = (Integer) mixedDurationPenaltyField.getValue();
final int frontLoadLargeTopicSize = (Integer) frontLoadLargeTopicSizeField.getValue();
final int frontLoadLastPeriodSize = (Integer) frontLoadLastPeriodSizeField.getValue();
final int frontLoadPenalty = (Integer) frontLoadPenaltyField.getValue();
setVisible(false);
examinationPanel.doProblemFactChange(scoreDirector -> {
Examination examination = scoreDirector.getWorkingSolution();
InstitutionParametrization institutionParametrization = examination.getInstitutionParametrization();
scoreDirector.beforeProblemPropertyChanged(institutionParametrization);
institutionParametrization.setTwoInARowPenalty(twoInARowPenalty);
institutionParametrization.setTwoInADayPenalty(twoInADayPenalty);
institutionParametrization.setPeriodSpreadLength(periodSpreadLength);
institutionParametrization.setPeriodSpreadPenalty(periodSpreadPenalty);
institutionParametrization.setMixedDurationPenalty(mixedDurationPenalty);
institutionParametrization.setFrontLoadLargeTopicSize(frontLoadLargeTopicSize);
institutionParametrization.setFrontLoadLastPeriodSize(frontLoadLastPeriodSize);
institutionParametrization.setFrontLoadPenalty(frontLoadPenalty);
scoreDirector.afterProblemPropertyChanged(institutionParametrization);
}, true);
}
}