coder-client/src/com/coder/client/gui/selectProject/SelectProjectDialog.java

177 lines
5 KiB
Java

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<SelectProjectDialogListener> listeners;
private ObservableList<ProjectListItem> projectList;
@FXML private ListView<ProjectListItem> 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<SelectProjectDialogListener>();
}
@Override
protected void willShow() {
for(SelectProjectDialogListener listener : this.listeners){
listener.willShow();
}
if(this.projectName != null){
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);
}
}
});
}
@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){
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);
}
}