package regexgolf2.ui.subcomponents.requirementlisting;
import java.io.IOException;
import java.util.List;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;
import regexgolf2.ui.subcomponents.requirementlisting.requirementcell.RequirementCellUI;
import regexgolf2.ui.subcomponents.requirementlisting.requirementcell.RequirementItem;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
public class RequirementListUI
{
private BooleanProperty _editableProperty = new SimpleBooleanProperty();
@FXML
private Label _titleLabel;
@FXML
private Button _addButton;
@FXML
private Button _removeButton;
@FXML
private ListView<RequirementItem> _listView;
private final Node _rootNode;
public RequirementListUI() throws IOException
{
FXMLLoader loader = new FXMLLoader(getClass().getResource("RequirementListUI.fxml"));
loader.setController(this);
_rootNode = loader.load();
assert _titleLabel != null;
assert _addButton != null;
assert _removeButton != null;
assert _listView != null;
initListView();
initBindings();
}
private void initBindings()
{
_addButton.visibleProperty().bind(_editableProperty);
_removeButton.visibleProperty().bind(_editableProperty);
_removeButton.disableProperty().bind(_listView.getSelectionModel().selectedItemProperty().isNull());
_listView.editableProperty().bind(_editableProperty);
_listView.mouseTransparentProperty().bind(_editableProperty.not());
_listView.focusTraversableProperty().bind(_editableProperty);
_editableProperty.addListener(new ChangeListener<Boolean>()
{
@Override
public void changed(ObservableValue<? extends Boolean> observable,
Boolean oldValue, Boolean newValue)
{
if (!newValue)
_listView.getSelectionModel().clearSelection();
}
});
}
private void initListView()
{
_listView.setCellFactory(new Callback<ListView<RequirementItem>, ListCell<RequirementItem>>()
{
@Override
public ListCell<RequirementItem> call(ListView<RequirementItem> lv)
{
RequirementCellUI cellUI = new RequirementCellUI();
cellUI.editableProperty().bind(lv.editableProperty());
return cellUI;
}
});
}
public Label getTitleLabel()
{
return _titleLabel;
}
public Button getAddButton()
{
return _addButton;
}
public Button getRemoveButton()
{
return _removeButton;
}
@Requires("requirementItem != null")
public void addRequirementItem(RequirementItem requirementItem)
{
_listView.getItems().add(requirementItem);
}
@Requires("requirementItem != null")
public void removeRequirementItem(RequirementItem requirementItem)
{
_listView.getItems().remove(requirementItem);
}
@Ensures("result != null")
public List<RequirementItem> getItems()
{
return _listView.getItems();
}
public void clear()
{
_listView.getItems().clear();
}
public boolean isEditable()
{
return _editableProperty.get();
}
public void setEditable(boolean editable)
{
_editableProperty.set(editable);
}
public BooleanProperty editableProperty()
{
return _editableProperty;
}
public RequirementItem getSelectedItem()
{
return _listView.getSelectionModel().getSelectedItem();
}
public Node getUINode()
{
return _rootNode;
}
}