package com.insightfullogic.honest_profiler.ports.javafx.controller.filter;
import static com.insightfullogic.honest_profiler.core.aggregation.filter.ValueType.DOUBLE;
import static com.insightfullogic.honest_profiler.core.aggregation.filter.ValueType.SHARE;
import static com.insightfullogic.honest_profiler.ports.javafx.util.ConversionUtil.getStringConverterForType;
import static com.insightfullogic.honest_profiler.ports.javafx.util.ResourceUtil.INFO_CHOICE_COMPARISONOPERATOR;
import static com.insightfullogic.honest_profiler.ports.javafx.util.ResourceUtil.INFO_CHOICE_FILTERTARGET;
import static com.insightfullogic.honest_profiler.ports.javafx.util.ResourceUtil.INFO_INPUT_FILTERVALUE;
import static javafx.scene.control.ButtonType.CANCEL;
import static javafx.scene.control.ButtonType.OK;
import java.util.HashMap;
import java.util.Map;
import com.insightfullogic.honest_profiler.core.aggregation.filter.Comparison;
import com.insightfullogic.honest_profiler.core.aggregation.filter.FilterItem;
import com.insightfullogic.honest_profiler.core.aggregation.filter.Target;
import com.insightfullogic.honest_profiler.core.aggregation.filter.ValueType;
import com.insightfullogic.honest_profiler.core.aggregation.result.ItemType;
import com.insightfullogic.honest_profiler.ports.javafx.controller.dialog.AbstractDialogController;
import com.insightfullogic.honest_profiler.ports.javafx.util.handle.ChangeListenerHandle;
import com.insightfullogic.honest_profiler.ports.javafx.util.validation.StringValidationListener;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.util.Callback;
public class FilterCreationDialogController<T> extends AbstractDialogController<FilterItem<T, ?>>
{
private final Map<ValueType, StringValidationListener> validatorMap = new HashMap<>();
@FXML
private Dialog<FilterItem<T, ?>> dialog;
@FXML
private DialogPane dialogPane;
@FXML
private ChoiceBox<Target> target;
@FXML
private ChoiceBox<Comparison> comparison;
@FXML
private TextField value;
@FXML
private Label percentLabel;
private ChangeListenerHandle<String> currentListenerHandle;
@Override
@FXML
protected void initialize()
{
super.initialize(dialog);
// Validator Map Population
Button okButton = (Button)dialogPane.lookupButton(OK);
for (ValueType type : ValueType.values())
{
validatorMap
.put(type, new StringValidationListener(value, type.getValidator(), okButton));
}
}
public void setItemType(ItemType itemType)
{
target.getItems().clear();
target.getItems().addAll(itemType.getAllowedTargets());
target.getSelectionModel().select(0);
}
// DialogController Implementation
@Override
public Callback<ButtonType, FilterItem<T, ?>> createResultHandler()
{
return buttonType -> buttonType == CANCEL ? null : new FilterItem<>(
target.getSelectionModel().getSelectedItem(),
comparison.getSelectionModel().getSelectedItem(),
target.getSelectionModel().getSelectedItem().getType().getInterpreter()
.apply(value.getText()));
}
@Override
public void reset()
{
dialogPane.lookupButton(OK).setDisable(true);
target.getSelectionModel().select(0);
resetSelection();
}
// Helper Methods
private void resetSelection()
{
comparison.getSelectionModel().select(0);
value.clear();
}
private void switchTarget(Target target)
{
comparison.getItems().clear();
comparison.getItems().addAll(target.getType().getAllowedComparisons());
if (currentListenerHandle != null)
{
currentListenerHandle.detach();
}
resetSelection();
boolean isPct = target.getType() == SHARE || target.getType() == DOUBLE;
percentLabel.setVisible(isPct);
percentLabel.setManaged(isPct);
currentListenerHandle = validatorMap.get(target.getType())
.attach(value.textProperty(), value);
}
// AbstractController Implementation
@Override
protected void initializeInfoText()
{
info(target, INFO_CHOICE_FILTERTARGET);
info(comparison, INFO_CHOICE_COMPARISONOPERATOR);
info(value, INFO_INPUT_FILTERVALUE);
}
@Override
protected void initializeHandlers()
{
dialog.setOnShown(event -> reset());
target.getSelectionModel().selectedItemProperty()
.addListener((property, oldValue, newValue) -> switchTarget(newValue));
// Choice Display
target.setConverter(getStringConverterForType(Target.class));
comparison.setConverter(getStringConverterForType(Comparison.class));
}
}