package regexgolf2.controllers;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.Tab;
import javafx.stage.Window;
import regexgolf2.model.SolvableChallenge;
import regexgolf2.services.services.Services;
import regexgolf2.ui.modules.ModulesUI;
import com.google.java.contract.Requires;
public class ModulesController
{
private final ModulesUI _ui;
private final ObjectProperty<SolvableChallenge> _selectedChallenge = new SimpleObjectProperty<>();
private final BooleanProperty _editableProperty = new SimpleBooleanProperty();
/**
* This map maps the Tabs in the TabPane to the contained Controllers. This
* is used to synchronize to currently displayed challenge with the selected
* Tab.
*/
private final Map<Tab, ChallengeContainer> _challengeContainerMap = new HashMap<>();
@Requires("services != null")
public ModulesController(Services services, Window parent) throws IOException
{
// Init child Controllers
ChallengeRepositoryController challengeRepoController = new ChallengeRepositoryController(
services.getPersistenceService());
ChallengeGeneratorController challengeGeneratorController = new ChallengeGeneratorController(
services, parent);
// Init UI
_ui = new ModulesUI();
_ui.setChallengeRepoPanelContent(challengeRepoController.getUINode());
_ui.setChallengeGeneratorPanel(challengeGeneratorController.getUINode());
// Init ChallengeContainerMap
_challengeContainerMap.put(_ui.getSavedChallengesTab(), challengeRepoController);
_challengeContainerMap.put(_ui.getChallengeGeneratorTab(), challengeGeneratorController);
// Add Handler to refresh Bindings if selected Tab changes
_ui.selectedTabProperty().addListener(
(o, oV, newValue) -> refreshBindings(_challengeContainerMap.get(newValue)));
// Call once to initialize
refreshBindings(_challengeContainerMap.get(_ui.getSelectedTab()));
}
/**
* Refreshes the selected Challenge and the editable Property.
*
* @param selectedContainer
* The selected component that should be used for the binding.
*/
@Requires("selectedContainer != null")
private void refreshBindings(ChallengeContainer selectedContainer)
{
_selectedChallenge.unbind();
_selectedChallenge.bind(selectedContainer.challengeProperty());
_editableProperty.unbind();
_editableProperty.bind(selectedContainer.editableProperty());
}
public ReadOnlyObjectProperty<SolvableChallenge> challengeProperty()
{
return _selectedChallenge;
}
public ReadOnlyBooleanProperty editableProperty()
{
return _editableProperty;
}
public Node getUINode()
{
return _ui.getUINode();
}
}