206 lines
6.4 KiB
Java
206 lines
6.4 KiB
Java
package com.coder.client.gui.selectProject;
|
|
|
|
import java.io.IOException;
|
|
import java.net.URL;
|
|
import java.util.ResourceBundle;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import zutil.log.LogUtil;
|
|
|
|
import javafx.beans.value.ChangeListener;
|
|
import javafx.beans.value.ObservableValue;
|
|
import javafx.collections.FXCollections;
|
|
import javafx.collections.ObservableList;
|
|
import javafx.event.ActionEvent;
|
|
import javafx.fxml.FXML;
|
|
import javafx.scene.control.Button;
|
|
import javafx.scene.control.Label;
|
|
import javafx.scene.control.ListCell;
|
|
import javafx.scene.control.ListView;
|
|
import javafx.scene.input.KeyCode;
|
|
import javafx.scene.input.KeyEvent;
|
|
import javafx.scene.input.MouseButton;
|
|
import javafx.scene.input.MouseEvent;
|
|
import javafx.util.Callback;
|
|
|
|
import com.coder.client.CoderClient;
|
|
import com.coder.client.gui.GuiWindow;
|
|
import com.coder.client.session.ProjectListRspMsgListener;
|
|
import com.coder.client.session.ProjectRspMsgListener;
|
|
import com.coder.server.message.CoderMessage;
|
|
import com.coder.server.message.ProjectListData;
|
|
import com.coder.server.message.ProjectListReqMsg;
|
|
import com.coder.server.message.ProjectListRspMsg;
|
|
import com.coder.server.message.ProjectRspMsg;
|
|
|
|
public class SelectProjectDialog extends GuiWindow {
|
|
public static final Logger logger = LogUtil.getLogger();
|
|
private ObservableList<ProjectListItem> projectList;
|
|
private CoderClient client;
|
|
|
|
@FXML private ListView<ProjectListItem> projectListView;
|
|
@FXML private Button newProjectButton;
|
|
@FXML private Button cancelButton;
|
|
@FXML private Button openButton;
|
|
@FXML private Label errorLabel;
|
|
|
|
public SelectProjectDialog(final CoderClient client) throws IOException {
|
|
super(SelectProjectDialog.class.getResource("SelectProjectDialog.fxml"));
|
|
this.client = client;
|
|
|
|
client.getSessionHandler().addMessageListener(new ProjectListRspMsgListener() {
|
|
@Override
|
|
public void messageReceived(final ProjectListRspMsg msg) {
|
|
logger.fine("a ProjectListRsp received");
|
|
for(String projectName : msg.keySet()){
|
|
ProjectListData projectData = msg.get(projectName);
|
|
addProjectToList(projectName, projectData);
|
|
}
|
|
}
|
|
});
|
|
|
|
client.getSessionHandler().addMessageListener(new ProjectRspMsgListener() {
|
|
@Override
|
|
public void messageReceived(final ProjectRspMsg msg) {
|
|
logger.fine("a ProjectRspMsg received");
|
|
if(msg.error != null){
|
|
logger.severe("Server responded on the project request with the following error message: " + msg.error);
|
|
client.getProjectHandler().setProject(null);
|
|
setErrorMessage("ERROR: " + msg.error);
|
|
}else{
|
|
setErrorMessage("");
|
|
client.getProjectHandler().setProject(msg.name);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
protected void willShow() {
|
|
clearProjectList();
|
|
if(!client.getProjectHandler().isProjectSet()){
|
|
sendProjectListReq();
|
|
}else{
|
|
logger.fine("will outofire the open button since all parameters are already set");
|
|
openButton.setDisable(false);
|
|
openButton.fire();
|
|
}
|
|
openButton.setDisable(true);
|
|
projectListView.requestFocus();
|
|
}
|
|
|
|
@Override
|
|
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
|
|
errorLabel.setText("");
|
|
projectList = FXCollections.observableArrayList();
|
|
projectListView.setItems(projectList);
|
|
projectListView.setCellFactory(new Callback<ListView<ProjectListItem>, ListCell<ProjectListItem>>(){
|
|
@Override
|
|
public ListCell<ProjectListItem> call(ListView<ProjectListItem> arg0) {
|
|
try {
|
|
return new ProjectListCell();
|
|
} catch (IOException e) {
|
|
logger.log(Level.SEVERE, "could not crate a ProjectListCell instance", e);
|
|
}
|
|
return null;
|
|
}
|
|
});
|
|
projectListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ProjectListItem>() {
|
|
@Override
|
|
public void changed(ObservableValue<? extends ProjectListItem> observable, ProjectListItem oldValue, ProjectListItem vewValue) {
|
|
if(observable.getValue() != null){
|
|
logger.fine("ProjectListItem [" + observable.getValue() + "] selected in the project list");
|
|
openButton.setDisable(false);
|
|
}else{
|
|
openButton.setDisable(true);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void sendProjectListReq(){
|
|
//send a request for a new list of projects
|
|
CoderMessage msg = new CoderMessage();
|
|
msg.ProjectListReq = new ProjectListReqMsg();
|
|
client.getSessionHandler().sendMessage(msg);
|
|
}
|
|
|
|
@FXML
|
|
protected void mouseClickedOnList(MouseEvent event){
|
|
if(event.getButton().equals(MouseButton.PRIMARY)){
|
|
if(event.getClickCount() == 2){ //if doublecklick
|
|
openButton.fire();
|
|
}
|
|
}
|
|
}
|
|
|
|
@FXML
|
|
protected void keyPressed(KeyEvent event) {
|
|
if(event.getCode() == KeyCode.ENTER){
|
|
logger.fine("User pressed the ENTER key");
|
|
openButton.fire();
|
|
}else if(event.getCode() == KeyCode.ESCAPE){
|
|
logger.fine("User pressed the ESCAPE key");
|
|
cancelButton.fire();
|
|
}else if(event.getCode() == KeyCode.N && event.isControlDown()){ //CTRL+N
|
|
logger.fine("User pressed CTRL+N");
|
|
newProjectButton.fire();
|
|
}
|
|
}
|
|
|
|
@FXML
|
|
protected void newProject(ActionEvent event){
|
|
logger.fine("new project button triggered");
|
|
client.getProjectHandler().createNewProject();
|
|
}
|
|
|
|
@FXML
|
|
protected void cancel(ActionEvent event){
|
|
logger.fine("cancel button triggered");
|
|
client.getSessionHandler().closeCurrentSession(false);
|
|
}
|
|
|
|
@FXML
|
|
protected void refresh(ActionEvent event){
|
|
logger.fine("refresh button triggered");
|
|
clearProjectList();
|
|
sendProjectListReq();
|
|
}
|
|
|
|
@FXML
|
|
protected void open(ActionEvent event){
|
|
logger.fine("open button triggered");
|
|
if(!client.getProjectHandler().isProjectSet()){
|
|
ProjectListItem selectedItem = projectListView.getSelectionModel().getSelectedItem();
|
|
client.getProjectHandler().setProject(selectedItem.getName());
|
|
}
|
|
client.getProjectHandler().openProject();
|
|
}
|
|
|
|
public void clearProjectList(){
|
|
logger.fine("Clearing project list");
|
|
projectList.clear();
|
|
}
|
|
|
|
public void addProjectToList(String projectName, ProjectListData projectData) {
|
|
logger.fine("Adding project \"" + projectName + "\" of type " + projectData.type + " to the project list");
|
|
ProjectListItem item = new ProjectListItem(projectName, projectData.type, projectData.description);
|
|
this.projectList.add(item);
|
|
}
|
|
|
|
@Override
|
|
protected String getTitle() {
|
|
return "Open Project";
|
|
}
|
|
|
|
private void setErrorMessage(String errorMsg){
|
|
this.errorLabel.setText(errorMsg);
|
|
}
|
|
|
|
@Override
|
|
protected String getDescriptiveName() {
|
|
return "Select Project Dialog";
|
|
}
|
|
|
|
}
|