package de.saxsys.projectiler.login;
import java.io.IOException;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.ReadOnlyBooleanWrapper;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import de.saxsys.projectiler.Projectiler;
//import de.saxsys.projectiler.UserDataStore;
import de.saxsys.projectiler.concurrent.LoginTask;
import de.saxsys.projectiler.misc.UITools;
public class Login extends VBox {
private static final Logger LOGGER = Logger.getLogger(Login.class.getSimpleName());
@FXML
private TextField usernameField;
@FXML
private PasswordField passwordField;
@FXML
private Button loginButton;
private final ReadOnlyBooleanWrapper loginSucessful = new ReadOnlyBooleanWrapper();
private final ReadOnlyBooleanWrapper loginFailed = new ReadOnlyBooleanWrapper();
private final Projectiler projectiler;
public Login(final Projectiler projectiler) {
this.projectiler = projectiler;
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Login.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (final IOException exception) {
throw new RuntimeException(exception);
}
}
@FXML
void onCloseAction(final ActionEvent event) {
System.exit(1);
}
@FXML
void onLoginButtonPressed(final ActionEvent event) {
storeUserData();
}
/**
*
*/
private void storeUserData() {
loginPending();
final String username = usernameField.getText();
final String password = passwordField.getText();
LOGGER.info("Stored user data " + username);
final LoginTask loginTask = new LoginTask(projectiler, username, password);
new Thread(loginTask).start();
loginTask.valueProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(final ObservableValue<? extends Boolean> arg0, final Boolean arg1,
final Boolean sucessful) {
loginSucessful.set(sucessful);
loginFailed.set(!sucessful);
loginFinished();
}
});
}
@FXML
void initialize() {
initTextFields();
initButtonBinding();
}
private void initTextFields() {
final String userName = projectiler.getUserName();
usernameField.setText(userName);
if (!userName.isEmpty()) {
Platform.runLater(new Runnable() {
@Override
public void run() {
passwordField.requestFocus();
}
});
}
}
private void initButtonBinding() {
loginButton.disableProperty().bind(
passwordField.textProperty().greaterThan("").not()
.or(usernameField.textProperty().greaterThan("").not()));
}
private void loginPending() {
loginButton.disableProperty().unbind();
UITools.disable(passwordField, usernameField, loginButton);
}
private void loginFinished() {
UITools.enable(passwordField, usernameField, loginButton);
initButtonBinding();
}
public ReadOnlyBooleanProperty loginSucessfulProperty() {
return loginSucessful.getReadOnlyProperty();
}
public ReadOnlyBooleanProperty loginFailedProperty() {
return loginFailed.getReadOnlyProperty();
}
public boolean getLoginSucessful() {
return loginSucessful.get();
}
public boolean getLoginFailed() {
return loginFailed.get();
}
}