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 projectList; private CoderClient client; @FXML private ListView 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, ListCell>(){ @Override public ListCell call(ListView 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() { @Override public void changed(ObservableValue 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"; } }