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.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import org.controlsfx.control.PropertySheet; import org.controlsfx.property.editor.PropertyEditor; import zutil.log.LogUtil; import com.coder.client.CoderClient; import com.coder.client.gui.GuiWindow; import com.coder.client.project.ProjectListener; import com.coder.client.property.CheckBoxProperty; 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.server.message.CoderMessage; 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 javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.util.Callback; public class EditorWindow extends GuiWindow { public static final Logger logger = LogUtil.getLogger(); private CoderClient client; @FXML private TreeView fileTreeView; @FXML private TextArea editTextArea; @FXML private PropertySheet propertySheet; @FXML private Button compileButton; @FXML private Button runButton; @FXML private Button exitButton; @FXML private Button changeProjectButton; 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) { 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.showOnStage(EditorWindow.this); 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"); } } }); client.getSessionHandler().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 } } } }); client.getProjectHandler().addprojectListener(new ProjectListener() { @Override public void selectProject() { } @Override public void openProjectFailed(String errorMsg) { } @Override public void openProject(String projectName) { CoderMessage msg = new CoderMessage(); msg.ProjectReq = new ProjectReqMsg(); msg.ProjectReq.name = projectName; client.getSessionHandler().sendMessage(msg); } @Override public void createNewProject() { } }); } @Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { setErrorMessage(""); setupPropertySheet(); setupFileTreeView(); } @Override public void willShow(){ } @FXML protected void run(ActionEvent event){ //TODO } @FXML protected void compile(ActionEvent event){ //TODO } @FXML protected void changeProject(ActionEvent event){ client.getProjectHandler().setProject(null); client.getProjectHandler().triggerSelectProject(); } @FXML protected void exit(ActionEvent event){ 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 public void changed(ObservableValue> item, TreeItem oldValue, TreeItem newValue) { if(newValue != fileTreeView.getRoot()){ System.out.println("INFO: item " + newValue + " selected"); } } }); TreeItem root = new TreeItem("root"); root.setExpanded(true); fileTreeView.setRoot(root); } private void setupPropertySheet(){ //handle custom ProperySheet.Item's editor propertySheet.setPropertyEditorFactory(new Callback>(){ @Override public PropertyEditor call(PropertySheet.Item param) { //only support internal types if(param instanceof CoderClientProperty){ return ((CoderClientProperty)param).getEditor(); } //not a internal property type return null; } }); propertySheet.getItems().clear(); 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 public String getTitle() { return "Coder Client"; } private void setErrorMessage(String msg) { // TODO Auto-generated method stub } @Override public String getDescriptiveName() { return "Editor Window"; } }