diff --git a/src/com/coder/client/SessionHandler.java b/src/com/coder/client/SessionHandler.java index ce7df83..342cce5 100644 --- a/src/com/coder/client/SessionHandler.java +++ b/src/com/coder/client/SessionHandler.java @@ -5,6 +5,8 @@ import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.JOptionPane; + import zutil.log.LogUtil; import com.coder.client.session.ProjectMessageListener; @@ -33,6 +35,7 @@ public class SessionHandler{ public boolean setupConnection(String url, int port){ if(session != null && session.isConnected()){ + logger.fine("setup connection called. there is already an active connection. will terminate the current connection first."); session.close(); } session = Session.setupConnection(url, port); @@ -112,15 +115,25 @@ public class SessionHandler{ } } - public void triggerAuthenticationCancel() { + public void triggerAuthenticationCanceledEvent() { if(session.isConnected() && !session.isAuthenticated()){ closeCurrentSession(false); for(SessionEventHandler eventHandler : sessionEventHandlers){ - eventHandler.sessionAuthenticationCancel(); + eventHandler.sessionAuthenticationCanceled(); } }else{ logger.warning("Can only cancel a connected but not yet authenticated authentication. ignoring call"); } } + public void triggerConnectionLostEvent(){ + if(session != null){ + session.close(); + session = null; + for(SessionEventHandler eventHandler : sessionEventHandlers){ + eventHandler.sessionDisconnected(true); + } + } + } + } diff --git a/src/com/coder/client/gui/editor/EditorWindow.java b/src/com/coder/client/gui/editor/EditorWindow.java index e64afb7..acb89a9 100644 --- a/src/com/coder/client/gui/editor/EditorWindow.java +++ b/src/com/coder/client/gui/editor/EditorWindow.java @@ -4,6 +4,7 @@ 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; @@ -31,6 +32,7 @@ import com.coder.server.message.ProjectReqMsg; import com.coder.server.message.ProjectRspMsg; import com.coder.server.message.ProjectTypeReqMsg; import com.coder.server.message.ProjectTypeRspMsg; +import com.coder.server.message.SupportedProperties; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -94,9 +96,35 @@ public class EditorWindow extends GuiWindow { sessionHandler.addMessageListener(new ProjectTypeRspMsgListener() { @Override public void messageReceived(ProjectTypeRspMsg msg) { - 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 + logger.fine("handling a ProjectTypeRspMsg"); + for(String type : msg.keySet()){ //for all project types in the ProjectTypeRspMsg + if(type.equals(projectType)){ //the current project type matches the project type in the message + logger.finer("the ProjectTypeRspMsg contins information for the curernt projects type ("+projectType+")"); + SupportedProperties projectTypeSupportedProperties = msg.get(type); //get list of supported properties + for(String propertyName : projectTypeSupportedProperties.keySet()){ //for each property name + logger.finer("the project type has a property named \""+propertyName+"\""); + List propertyAlternativeValues = projectTypeSupportedProperties.get(propertyName); //get the list of all valid alternative values to the property + + logger.finer("looking for an existing property in the property sheet with the same name"); + boolean foundProperty = false; + for(PropertySheet.Item propertySheetItem : propertySheet.getItems()){ //for all property sheet items in the GUI + if(propertySheetItem instanceof ComboBoxProperty){ //if the item is a combo box + ComboBoxProperty comboBoxProperty = (ComboBoxProperty) propertySheetItem; //cast to combo box + if(comboBoxProperty.getName().equals(propertyName)){ //if combo box property name is the same as the property name + logger.finer("the property sheet already contained a property with the same name."); + foundProperty = true; + logger.finer("adding alternative values to the existing property"); + comboBoxProperty.setAlternativeValues(propertyAlternativeValues); //add the alternative values + } + } + } + if(!foundProperty){ + logger.finer("the property was not present in the property sheet. adding it."); + ComboBoxProperty comboProperty = new ComboBoxProperty(propertyName, null, propertyAlternativeValues); + propertySheet.getItems().add(comboProperty); + } + + } } } } @@ -169,13 +197,6 @@ public class EditorWindow extends GuiWindow { client.exit(); } - private void sendProjectTypeReqMsg(String type){ - CoderMessage msg = new CoderMessage(); - msg.ProjectTypeReq = new ProjectTypeReqMsg(); - msg.ProjectTypeReq.type = type; - sessionHandler.sendMessage(msg); - } - private void setupFileTreeView(){ fileTreeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener>() { @Override @@ -221,16 +242,6 @@ public class EditorWindow extends GuiWindow { propertySheet.getItems().clear(); - /* EXAMPLE CODE: - ArrayList boards = new ArrayList(); - boards.add("UNO"); - boards.add("Mega"); - ComboBoxProperty p1 = new ComboBoxProperty("Port", null, boards); - propertySheet.getItems().add(p1); - - CheckBoxProperty p2 = new CheckBoxProperty("Melt?", false); - propertySheet.getItems().add(p2); - */ } @Override @@ -251,7 +262,7 @@ public class EditorWindow extends GuiWindow { private void loadProject(final String projectName, final String projectType, final String projectDescription, final Properties projectConfig, ArrayList projectFileList){ logger.info("loading project \""+projectName+"\""); - client.showOnStage(EditorWindow.this); //TODO: show "loading project" popup instead + //TODO: show "loading project" popup //handle name and description fileTreeView.getRoot().setValue(new FileTreeDirectory(projectName)); //set file tree root name to the project name @@ -273,7 +284,12 @@ public class EditorWindow extends GuiWindow { //request alternative values for config of this project type this.projectType = projectType; - sendProjectTypeReqMsg(projectType); + + //send ProjectTypeReqMsg for the project type + CoderMessage msg = new CoderMessage(); + msg.ProjectTypeReq = new ProjectTypeReqMsg(); + msg.ProjectTypeReq.type = projectType; + sessionHandler.sendMessage(msg); }else{ logger.fine("the project has no configuration"); diff --git a/src/com/coder/client/gui/login/LoginDialog.java b/src/com/coder/client/gui/login/LoginDialog.java index 273f321..afe1394 100644 --- a/src/com/coder/client/gui/login/LoginDialog.java +++ b/src/com/coder/client/gui/login/LoginDialog.java @@ -58,9 +58,10 @@ public class LoginDialog extends GuiWindow { @Override public void sessionAuthenticationFailure() { setErrorMessage("Wrong username or password"); + passwordPasswordField.setText(null); } @Override - public void sessionAuthenticationCancel() { + public void sessionAuthenticationCanceled() { setErrorMessage(null); } }); @@ -73,9 +74,11 @@ public class LoginDialog extends GuiWindow { @Override public void willShow(){ - passwordPasswordField.setText(""); if( (errorLabel.getText() == null || (errorLabel.getText() != null && errorLabel.getText().isEmpty())) && usernameTextField.getText() != null && !usernameTextField.getText().isEmpty()){ passwordPasswordField.requestFocus(); + if(passwordPasswordField.getText() != null && !passwordPasswordField.getText().isEmpty()){ + loginButton.fire(); + } }else{ usernameTextField.requestFocus(); passwordPasswordField.setText(""); @@ -106,7 +109,7 @@ public class LoginDialog extends GuiWindow { @FXML protected void cancel(ActionEvent event){ logger.fine("cancel button triggered"); - sessionHandler.triggerAuthenticationCancel(); + sessionHandler.triggerAuthenticationCanceledEvent(); } public void setUsername(String username){ diff --git a/src/com/coder/client/gui/selectProject/SelectProjectDialog.java b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java index 4421a7f..a5c740a 100644 --- a/src/com/coder/client/gui/selectProject/SelectProjectDialog.java +++ b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java @@ -81,7 +81,7 @@ public class SelectProjectDialog extends GuiWindow { } @Override - public void sessionAuthenticationCancel() { + public void sessionAuthenticationCanceled() { } }); diff --git a/src/com/coder/client/gui/selectServer/SelectServerDialog.java b/src/com/coder/client/gui/selectServer/SelectServerDialog.java index 2ec2068..02b79a4 100644 --- a/src/com/coder/client/gui/selectServer/SelectServerDialog.java +++ b/src/com/coder/client/gui/selectServer/SelectServerDialog.java @@ -7,6 +7,8 @@ import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.JOptionPane; + import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -69,6 +71,7 @@ public class SelectServerDialog extends GuiWindow { logger.info("No reconnection should be performed, reseting server address"); setServerAddress(null); }else{ + JOptionPane.showMessageDialog(null, "Connection to server lost. Will try to reconnect."); setErrorMessage("The current session was disconnected"); } logger.fine("session disconnected, will show the select server dialog on the main stage"); @@ -92,7 +95,7 @@ public class SelectServerDialog extends GuiWindow { client.showOnStage(SelectServerDialog.this); } @Override - public void sessionAuthenticationCancel() { + public void sessionAuthenticationCanceled() { setServerAddress(null); setErrorMessage(null); logger.fine("session authentication canceled, will show the select server dialog on the main stage"); diff --git a/src/com/coder/client/property/CoderClientProperty.java b/src/com/coder/client/property/CoderClientProperty.java index c0dca3c..7d6aeba 100644 --- a/src/com/coder/client/property/CoderClientProperty.java +++ b/src/com/coder/client/property/CoderClientProperty.java @@ -21,7 +21,7 @@ public abstract class CoderClientProperty implements PropertySheet.Item { } @Override - public Object getValue() { + public T getValue() { return value; } @@ -29,7 +29,7 @@ public abstract class CoderClientProperty implements PropertySheet.Item { public boolean isEditable() { return true; } - + @SuppressWarnings("unchecked") @Override public void setValue(Object value) { diff --git a/src/com/coder/client/property/ComboBoxProperty.java b/src/com/coder/client/property/ComboBoxProperty.java index 067f633..0f0f612 100644 --- a/src/com/coder/client/property/ComboBoxProperty.java +++ b/src/com/coder/client/property/ComboBoxProperty.java @@ -28,5 +28,12 @@ public class ComboBoxProperty extends CoderClientProperty { PropertyEditor editor = Editors.createChoiceEditor(this, valueAlternatives); return editor; } + + public void setAlternativeValues(Collection valueAlternatives){ + this.valueAlternatives = valueAlternatives; + if(! valueAlternatives.contains(getValue())){ + setValue(null); + } + } } diff --git a/src/com/coder/client/session/ProjectMessageListener.java b/src/com/coder/client/session/ProjectMessageListener.java index f4f8134..637de68 100644 --- a/src/com/coder/client/session/ProjectMessageListener.java +++ b/src/com/coder/client/session/ProjectMessageListener.java @@ -1,5 +1,5 @@ package com.coder.client.session; public interface ProjectMessageListener { - + } diff --git a/src/com/coder/client/session/Session.java b/src/com/coder/client/session/Session.java index e2c3da9..d125367 100755 --- a/src/com/coder/client/session/Session.java +++ b/src/com/coder/client/session/Session.java @@ -16,6 +16,7 @@ import zutil.log.OutputStreamLogger; import zutil.parser.json.JSONObjectInputStream; import zutil.parser.json.JSONObjectOutputStream; +import com.coder.client.SessionHandler; import com.coder.server.message.AuthenticationReqMsg; import com.coder.server.message.AuthenticationRspMsg; import com.coder.server.message.CoderMessage; @@ -90,6 +91,7 @@ public class Session extends Thread { } logger.fine("the current session will be closed"); close(); + SessionHandler.getInstance().triggerConnectionLostEvent(); return; } diff --git a/src/com/coder/client/session/SessionEventHandler.java b/src/com/coder/client/session/SessionEventHandler.java index 391b078..f77c644 100644 --- a/src/com/coder/client/session/SessionEventHandler.java +++ b/src/com/coder/client/session/SessionEventHandler.java @@ -13,6 +13,6 @@ public interface SessionEventHandler { void sessionDisconnected(boolean tryToEstablishConnection); - void sessionAuthenticationCancel(); + void sessionAuthenticationCanceled(); }