package games.strategy.triplea.settings;
import java.util.ArrayList;
import java.util.List;
import games.strategy.ui.SwingComponents;
public interface SettingsTab<SettingsModelType extends HasDefaults> {
String getTabTitle();
List<SettingInputComponent<SettingsModelType>> getInputs();
SettingsModelType getSettingsObject();
default void updateSettings(final List<SettingInputComponent<SettingsModelType>> inputs) {
final StringBuilder msg = new StringBuilder();
final StringBuilder failMsg = new StringBuilder();
// keep track explicitly of the status..
boolean somethingSaved = false;
boolean somethingInvalid = false;
final List<String> invalidValues = new ArrayList<>();
for (final SettingInputComponent<SettingsModelType> input : inputs) {
final SettingsModelType settingsObject = getSettingsObject();
final String oldValue = input.getValue(settingsObject);
if (input.updateSettings(settingsObject)) {
final String newValue = input.getInputElement().getText();
if (!newValue.equals(oldValue)) {
if (!msg.toString().isEmpty()) {
msg.append("\n");
}
msg.append(input.getLabel()).append(": ").append(oldValue).append(" -> ").append(newValue);
somethingSaved = true;
}
} else {
if (!failMsg.toString().isEmpty()) {
failMsg.append("\n");
}
failMsg.append(input.getLabel()).append(": ").append(input.getErrorMessage());
invalidValues.add(input.getInputElement().getText());
input.setValue(oldValue);
somethingInvalid = true;
}
}
final String title;
final String message;
if (!somethingSaved && !somethingInvalid) {
// TODO: Save button should not be enabled unless something is updated, so we would never fall into this case.
title = "No Values Updated";
message = "No values were updated, new settings are same as current";
} else if (somethingSaved && !somethingInvalid) {
title = "Settings Updated";
message = msg.toString();
} else if (!somethingSaved && somethingInvalid) {
title = "Failed to Save Settings";
message = failMsg.toString();
} else {
title = "Some Settings Saved";
message = "Successfully updated\n" + msg.toString() + "\n\nNOT Updated\n" + failMsg.toString();
}
SwingComponents.showDialog(title, message);
}
}