package com.coder.client.gui.selectProject; import java.io.IOException; import java.net.URL; import java.util.HashSet; 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.gui.GuiWindow; import com.coder.server.message.ProjectListData; public class SelectProjectDialog extends GuiWindow { public static final Logger logger = LogUtil.getLogger(); private HashSet listeners; private ObservableList projectList; @FXML private ListView projectListView; @FXML private Button newProjectButton; @FXML private Button cancelButton; @FXML private Button openButton; @FXML private Label errorLabel; private String projectName = null; public SelectProjectDialog() throws IOException { super(SelectProjectDialog.class.getResource("SelectProjectDialog.fxml")); listeners = new HashSet(); } @Override protected void willShow() { for(SelectProjectDialogListener listener : this.listeners){ listener.willShow(); } if(this.projectName != null && !this.projectName.isEmpty()){ 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); } } }); } @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){ for(SelectProjectDialogListener listener : this.listeners){ listener.newProject(); } } @FXML protected void cancel(ActionEvent event){ for(SelectProjectDialogListener listener : this.listeners){ listener.cancel(); } } @FXML protected void refresh(ActionEvent event){ for(SelectProjectDialogListener listener : this.listeners){ listener.refresh(); } } @FXML protected void open(ActionEvent event){ if(this.projectName == null || this.projectName.isEmpty()){ ProjectListItem selectedItem = projectListView.getSelectionModel().getSelectedItem(); projectName = selectedItem.getName(); } for(SelectProjectDialogListener listener : this.listeners){ if(projectName != null){ listener.open(projectName); } } } public void addSelectProjectDialogListener(SelectProjectDialogListener listener){ this.listeners.add(listener); } 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 project list"); ProjectListItem item = new ProjectListItem(projectName, projectData.type, projectData.description); this.projectList.add(item); } @Override protected String getTitle() { return "Open Project"; } public void setProject(String project) { this.projectName = project; } @Override public void setErrorMessage(String errorMsg){ this.errorLabel.setText(errorMsg); } public boolean isProjectSelected() { return this.projectName != null && !this.projectName.isEmpty(); } public String getSelectedProject() { return this.projectName; } }