diff --git a/src/com/coder/client/CoderClient.java b/src/com/coder/client/CoderClient.java index afde263..4bd34a6 100755 --- a/src/com/coder/client/CoderClient.java +++ b/src/com/coder/client/CoderClient.java @@ -202,6 +202,16 @@ public class CoderClient extends Application{ } }); } + @Override + public void openProjectFailed(String errorMsg) { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("open project failed, will show the select project dialog on the main stage"); + selectProjectDialog.showOnStage(mainStage); + } + }); + } }); //add message listeners diff --git a/src/com/coder/client/gui/GuiWindow.java b/src/com/coder/client/gui/GuiWindow.java index b6f0073..8e12e83 100644 --- a/src/com/coder/client/gui/GuiWindow.java +++ b/src/com/coder/client/gui/GuiWindow.java @@ -33,16 +33,12 @@ public abstract class GuiWindow implements Initializable{ * @param stage The stage to show on */ public void showOnStage(Stage stage){ - if(scene != null && stage.getScene() != null && stage.getScene().equals(scene)){ - logger.fine("already showing " + getDescriptiveName() + " on stage"); - }else{ - stage.setScene(scene); - stage.setTitle(getTitle()); - logger.fine("about to show " + getDescriptiveName() + " on stage"); - willShow(); - stage.show(); - logger.fine("showing " + getDescriptiveName()); - } + stage.setScene(scene); + stage.setTitle(getTitle()); + logger.fine("about to show " + getDescriptiveName() + " on stage"); + willShow(); + stage.show(); + logger.fine("showing " + getDescriptiveName()); } protected abstract String getDescriptiveName(); diff --git a/src/com/coder/client/gui/editor/EditorWindow.java b/src/com/coder/client/gui/editor/EditorWindow.java index d80cda7..7f14bd7 100644 --- a/src/com/coder/client/gui/editor/EditorWindow.java +++ b/src/com/coder/client/gui/editor/EditorWindow.java @@ -3,9 +3,10 @@ package com.coder.client.gui.editor; import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.Enumeration; import java.util.List; -import java.util.Properties; import java.util.ResourceBundle; +import java.util.logging.Level; import java.util.logging.Logger; import org.controlsfx.control.PropertySheet; @@ -20,8 +21,9 @@ import com.coder.client.property.CoderClientProperty; import com.coder.client.property.ComboBoxProperty; import com.coder.client.session.ProjectRspMsgListener; import com.coder.client.session.ProjectTypeRspMsgListener; -import com.coder.client.session.SessionListener; +import com.coder.server.message.CoderMessage; import com.coder.server.message.ProjectRspMsg; +import com.coder.server.message.ProjectTypeReqMsg; import com.coder.server.message.ProjectTypeRspMsg; import javafx.beans.value.ChangeListener; @@ -46,35 +48,87 @@ public class EditorWindow extends GuiWindow { @FXML private Button exitButton; @FXML private Button changeProjectButton; - public EditorWindow(CoderClient client) throws IOException{ + private String projectType = null; + + public EditorWindow(final CoderClient client) throws IOException{ super(EditorWindow.class.getResource("EditorWindow.fxml")); this.client = client; client.getSessionHandler().addMessageListener(new ProjectRspMsgListener() { @Override public void messageReceived(final ProjectRspMsg msg) { - logger.fine("a ProjectRspMsg received"); - if(msg.error != null){ - return; + try{ + 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); + return; + }else{ + client.getProjectHandler().setProject(msg.name); + } + + + //handle name and description + fileTreeView.getRoot().setValue(msg.name); //set file tree root name to the project name + String projectDescription = msg.description; + + //handle config + propertySheet.getItems().clear(); + Enumeration propertyNames = (Enumeration) msg.config.propertyNames(); + while(propertyNames.hasMoreElements()){ //populate propertySheet with all config elements + String propertyName = propertyNames.nextElement(); + String propertyValue = msg.config.getProperty(propertyName); + ComboBoxProperty comboProperty = new ComboBoxProperty(propertyName, propertyValue, null); + propertySheet.getItems().add(comboProperty); + } + + //request alternative values for config of this project type + projectType = msg.type; + sendProjectTypeReqMsg(projectType); + + //handle file list + List fileList = msg.fileList; + fileTreeView.getRoot().getChildren().clear(); + for(String filePath : fileList){ + if(filePath.endsWith("/")){ + logger.warning("file: \"" + filePath + "\" in file list is a directory and not a file. Currently not supported. Ignoring entry"); + continue; + } + if(filePath.startsWith("/")){ + filePath = filePath.substring(1, filePath.length()); + } + TreeItem tmpParent = fileTreeView.getRoot(); + for(String fileSplit : filePath.split("/")){ + if(!tmpParent.getChildren().contains(fileSplit)){ + logger.finer("adding file/directory \""+fileSplit+"\" to directory \""+tmpParent+"\""); + TreeItem tmpChild = new TreeItem(fileSplit); + tmpParent = tmpChild; + }else{ + int index = tmpParent.getChildren().indexOf(fileSplit); + tmpParent = tmpParent.getChildren().get(index); + } + } + } + }catch(Exception e){ + logger.log(Level.FINE, "could not load the project", e); + client.getProjectHandler().triggerOpenProjectFailure("ERROR: failure while loading project"); } - setProjectName(msg.name); - - Properties projectConfig = msg.config; - String projectDescription = msg.description; - List fileList = msg.fileList; - String projectType = msg.type; - //TODO: handle msg } }); client.getSessionHandler().addMessageListener(new ProjectTypeRspMsgListener() { @Override public void messageReceived(ProjectTypeRspMsg msg) { - //TODO: update the project properties + for(String type : msg.keySet()){ + if(type.equals(projectType)){ //the current project type matches the project type in the message + //TODO: handle type specific configurations + } + } } }); } @Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { + setErrorMessage(""); setupPropertySheet(); setupFileTreeView(); } @@ -97,7 +151,7 @@ public class EditorWindow extends GuiWindow { @FXML protected void changeProject(ActionEvent event){ client.getProjectHandler().setProject(null); - client.getProjectHandler().selectProject(); + client.getProjectHandler().triggerSelectProject(); } @FXML @@ -105,6 +159,13 @@ public class EditorWindow extends GuiWindow { client.exit(); } + private void sendProjectTypeReqMsg(String type){ + CoderMessage msg = new CoderMessage(); + msg.ProjectTypeReq = new ProjectTypeReqMsg(); + msg.ProjectTypeReq.type = type; + client.getSessionHandler().sendMessage(msg); + } + private void setupFileTreeView(){ fileTreeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener>() { @Override @@ -157,10 +218,6 @@ public class EditorWindow extends GuiWindow { } - public void setProjectName(String name) { - fileTreeView.getRoot().setValue(name); - } - @Override protected String getDescriptiveName() { return "Editor Window"; diff --git a/src/com/coder/client/gui/login/LoginDialog.java b/src/com/coder/client/gui/login/LoginDialog.java index 83c1406..c940afa 100644 --- a/src/com/coder/client/gui/login/LoginDialog.java +++ b/src/com/coder/client/gui/login/LoginDialog.java @@ -69,7 +69,7 @@ public class LoginDialog extends GuiWindow { @Override protected void willShow(){ passwordPasswordField.setText(""); - if(errorLabel.getText() != null && errorLabel.getText().isEmpty() && usernameTextField.getText() != null && !usernameTextField.getText().isEmpty()){ + if( (errorLabel.getText() == null || (errorLabel.getText() != null && errorLabel.getText().isEmpty())) && usernameTextField.getText() != null && !usernameTextField.getText().isEmpty()){ passwordPasswordField.requestFocus(); }else{ usernameTextField.requestFocus(); diff --git a/src/com/coder/client/gui/newProject/NewProjectDialog.java b/src/com/coder/client/gui/newProject/NewProjectDialog.java index 28a26f6..d87c50d 100755 --- a/src/com/coder/client/gui/newProject/NewProjectDialog.java +++ b/src/com/coder/client/gui/newProject/NewProjectDialog.java @@ -72,7 +72,7 @@ public class NewProjectDialog extends GuiWindow { @Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { - errorMessageLabel.setText(""); + setErrorMessage(""); } private void sendProjectTypeReqMsg(){ @@ -93,14 +93,14 @@ public class NewProjectDialog extends GuiWindow { return; } - client.getProjectHandler().createNewProject(projectNameTextField.getText(), projectTypeComboBox.getValue(), projectDescriptionTextField.getText()); + client.getProjectHandler().triggerCreateNewProject(projectNameTextField.getText(), projectTypeComboBox.getValue(), projectDescriptionTextField.getText()); } @FXML protected void cancel(ActionEvent event){ logger.fine("cancel button triggered"); client.getProjectHandler().setProject(null); - client.getProjectHandler().selectProject(); + client.getProjectHandler().triggerSelectProject(); } @FXML diff --git a/src/com/coder/client/gui/selectProject/SelectProjectDialog.java b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java index f00a8b4..9915772 100644 --- a/src/com/coder/client/gui/selectProject/SelectProjectDialog.java +++ b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java @@ -26,6 +26,7 @@ import javafx.util.Callback; import com.coder.client.CoderClient; import com.coder.client.gui.GuiWindow; +import com.coder.client.project.ProjectListener; import com.coder.client.session.ProjectListRspMsgListener; import com.coder.client.session.ProjectRspMsgListener; import com.coder.server.message.CoderMessage; @@ -66,14 +67,36 @@ public class SelectProjectDialog extends GuiWindow { 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); } } }); + + client.getProjectHandler().addprojectListener(new ProjectListener() { + @Override + public void selectProject() { + + } + @Override + public void openProjectFailed(String errorMsg) { + logger.fine("open project failed, setting error message to \""+errorMsg+"\""); + setErrorMessage(errorMsg); + } + @Override + public void openProject(String projectName) { + + } + @Override + public void createNewProject(String name, String type, String description) { + + } + @Override + public void createNewProject() { + + } + }); } @Override @@ -82,7 +105,7 @@ public class SelectProjectDialog extends GuiWindow { if(!client.getProjectHandler().isProjectSet()){ sendProjectListReq(); }else{ - logger.fine("will outofire the open button since all parameters are already set"); + logger.fine("will outofire the open button since all required parameters are already set ("+client.getProjectHandler()+")"); openButton.setDisable(false); openButton.fire(); } @@ -152,7 +175,7 @@ public class SelectProjectDialog extends GuiWindow { @FXML protected void newProject(ActionEvent event){ logger.fine("new project button triggered"); - client.getProjectHandler().createNewProject(); + client.getProjectHandler().triggerCreateNewProject(); } @FXML @@ -175,7 +198,7 @@ public class SelectProjectDialog extends GuiWindow { ProjectListItem selectedItem = projectListView.getSelectionModel().getSelectedItem(); client.getProjectHandler().setProject(selectedItem.getName()); } - client.getProjectHandler().openProject(); + client.getProjectHandler().triggerOpenProject(); } public void clearProjectList(){ diff --git a/src/com/coder/client/project/ProjectHandler.java b/src/com/coder/client/project/ProjectHandler.java index 788f9f7..67faa2c 100644 --- a/src/com/coder/client/project/ProjectHandler.java +++ b/src/com/coder/client/project/ProjectHandler.java @@ -1,21 +1,24 @@ package com.coder.client.project; import java.util.HashSet; +import java.util.logging.Logger; + +import zutil.log.LogUtil; public class ProjectHandler { - + public static final Logger logger = LogUtil.getLogger(); private HashSet projectListeners = new HashSet(); private String projectName = null; - public void createNewProject() { + public void triggerCreateNewProject() { projectName = null; for(ProjectListener listener : projectListeners){ listener.createNewProject(); } } - public void createNewProject(String name, String type, String description){ + public void triggerCreateNewProject(String name, String type, String description){ for(ProjectListener listener : projectListeners){ listener.createNewProject(name, type, description); } @@ -26,16 +29,17 @@ public class ProjectHandler { } public void setProject(String name) { + logger.fine("setting current project name to \""+name+"\""); this.projectName = name; } - public void selectProject() { + public void triggerSelectProject() { for(ProjectListener listener : projectListeners){ listener.selectProject(); } } - public void openProject() { + public void triggerOpenProject() { for(ProjectListener listener : projectListeners){ listener.openProject(projectName); } @@ -44,5 +48,16 @@ public class ProjectHandler { public void addprojectListener(ProjectListener listener){ this.projectListeners.add(listener); } + + public void triggerOpenProjectFailure(String errorMsg){ + projectName = null; + for(ProjectListener listener : projectListeners){ + listener.openProjectFailed(errorMsg); + } + } + + public String toString(){ + return "project name = \""+projectName+"\""; + } } diff --git a/src/com/coder/client/project/ProjectListener.java b/src/com/coder/client/project/ProjectListener.java index eaabad6..d881e29 100644 --- a/src/com/coder/client/project/ProjectListener.java +++ b/src/com/coder/client/project/ProjectListener.java @@ -5,4 +5,5 @@ public interface ProjectListener { public void createNewProject(String name, String type, String description); public void selectProject(); public void openProject(String projectName); + public void openProjectFailed(String errorMsg); } diff --git a/src/com/coder/client/property/ComboBoxProperty.java b/src/com/coder/client/property/ComboBoxProperty.java index 2f223b0..067f633 100644 --- a/src/com/coder/client/property/ComboBoxProperty.java +++ b/src/com/coder/client/property/ComboBoxProperty.java @@ -25,7 +25,8 @@ public class ComboBoxProperty extends CoderClientProperty { @Override public PropertyEditor getEditor() { - return Editors.createChoiceEditor(this, valueAlternatives); + PropertyEditor editor = Editors.createChoiceEditor(this, valueAlternatives); + return editor; } }