/*
* Copyright 2015 Bekwam, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.bekwam.examples.javafx.menubutton;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* Main JavaFX Controller for app
*
* @author carl_000
*/
public class CollegeSelectionController {
private Logger logger = LoggerFactory.getLogger(CollegeSelectionController.class);
@FXML
MenuButton mbPrefCollege;
@FXML
TextField tfPrefCollege;
@FXML
Label lblStatus;
@FXML
ProgressBar pbStatus;
private BekwamDotNetDAO dao = new BekwamDotNetDAO();
private EventHandler<ActionEvent> successHandler = (evt) -> {
MenuItem mi = (MenuItem)evt.getSource();
tfPrefCollege.setText( mi.getText() );
};
@FXML
public void keyTriggerMbPrefCollege(KeyEvent evt) {
if( evt.getCode() == KeyCode.ALT || evt.getCode() == KeyCode.TAB ) {
return;
}
triggerMbPrefCollege();
}
@FXML
public void triggerMbPrefCollege() {
if( logger.isDebugEnabled() ) {
logger.debug("[TRIGGER]");
}
Task<Void> task = new Task<Void>() {
private Optional<List<String>> collegeList = Optional.empty();
@Override
protected Void call() throws Exception {
updateMessage("Loading colleges...");
updateProgress(0.1d, 1.0d);
Platform.runLater( () -> {
mbPrefCollege.getItems().clear();
mbPrefCollege.getItems().add(new MenuItem("Loading..."));
});
PreferredColleges preferredColleges = dao.findPreferredColleges();
collegeList = Optional.of(
preferredColleges
.getPreferredColleges()
.stream()
.map(College::getCollegeName)
.collect(Collectors.toList())
);
updateProgress(0.9d, 1.0d);
return null;
}
@Override
protected void succeeded() {
super.succeeded();
Platform.runLater(() -> {
mbPrefCollege.getItems().clear();
if (collegeList.isPresent()) {
List<MenuItem> menuItems = collegeList.get()
.stream()
.map((s) -> {
MenuItem mi = new MenuItem(s);
mi.setOnAction(successHandler);
return mi;
})
.collect(Collectors.toList());
mbPrefCollege.getItems().addAll(menuItems);
}
});
updateMessage("");
updateProgress(1.0d, 1.0d);
}
@Override
protected void cancelled() {
super.cancelled();
logger.error("find operation cancelled");
updateMessage("");
updateProgress(1.0d, 1.0d);
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.INFORMATION, "Find operation cancelled");
alert.showAndWait();
mbPrefCollege.getItems().clear();
mbPrefCollege.getItems().add(new MenuItem("Loading..."));
});
}
@Override
protected void failed() {
super.failed();
logger.error("find operation failed", getException());
updateMessage("");
updateProgress(1.0d, 1.0d);
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR, "Find operation failed with '" + getException().getMessage() + "'");
alert.showAndWait();
});
mbPrefCollege.getItems().clear();
mbPrefCollege.getItems().add(new MenuItem("Loading..."));
}
};
lblStatus.textProperty().bind( task.messageProperty() );
pbStatus.progressProperty().bind( task.progressProperty() );
lblStatus.visibleProperty().bind( task.runningProperty() );
pbStatus.visibleProperty().bind( task.runningProperty() );
new Thread(task).start();
mbPrefCollege.show();
}
}