coder-client/src/com/coder/client/gui/editor/EditorWindow.java

227 lines
7 KiB
Java
Raw Normal View History

2015-10-20 14:26:58 +00:00
package com.coder.client.gui.editor;
2015-10-20 06:56:14 +00:00
2015-10-20 14:26:58 +00:00
import java.io.IOException;
2015-10-20 06:56:14 +00:00
import java.net.URL;
import java.util.ArrayList;
2015-11-13 11:58:23 +01:00
import java.util.Enumeration;
import java.util.List;
2015-10-20 06:56:14 +00:00
import java.util.ResourceBundle;
2015-11-13 11:58:23 +01:00
import java.util.logging.Level;
import java.util.logging.Logger;
2015-10-20 06:56:14 +00:00
import org.controlsfx.control.PropertySheet;
import org.controlsfx.property.editor.PropertyEditor;
import zutil.log.LogUtil;
import com.coder.client.CoderClient;
2015-10-20 14:26:58 +00:00
import com.coder.client.gui.GuiWindow;
2015-10-20 06:56:14 +00:00
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;
2015-11-13 11:58:23 +01:00
import com.coder.server.message.CoderMessage;
import com.coder.server.message.ProjectRspMsg;
2015-11-13 11:58:23 +01:00
import com.coder.server.message.ProjectTypeReqMsg;
import com.coder.server.message.ProjectTypeRspMsg;
2015-10-20 06:56:14 +00:00
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;
2015-10-20 14:26:58 +00:00
public class EditorWindow extends GuiWindow {
public static final Logger logger = LogUtil.getLogger();
private CoderClient client;
2015-10-20 06:56:14 +00:00
@FXML private TreeView<String> 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;
2015-10-20 06:56:14 +00:00
2015-11-13 11:58:23 +01:00
private String projectType = null;
public EditorWindow(final CoderClient client) throws IOException{
2015-10-20 14:26:58 +00:00
super(EditorWindow.class.getResource("EditorWindow.fxml"));
this.client = client;
client.getSessionHandler().addMessageListener(new ProjectRspMsgListener() {
@Override
public void messageReceived(final ProjectRspMsg msg) {
2015-11-13 11:58:23 +01:00
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<String> propertyNames = (Enumeration<String>) 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<String> 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<String> tmpParent = fileTreeView.getRoot();
for(String fileSplit : filePath.split("/")){
if(!tmpParent.getChildren().contains(fileSplit)){
logger.finer("adding file/directory \""+fileSplit+"\" to directory \""+tmpParent+"\"");
TreeItem<String> tmpChild = new TreeItem<String>(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) {
2015-11-13 11:58:23 +01:00
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
}
}
}
});
2015-10-20 06:56:14 +00:00
}
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
2015-11-13 11:58:23 +01:00
setErrorMessage("");
2015-10-20 06:56:14 +00:00
setupPropertySheet();
setupFileTreeView();
2015-10-20 14:26:58 +00:00
}
@Override
protected void willShow(){
2015-10-20 06:56:14 +00:00
}
@FXML
protected void run(ActionEvent event){
//TODO
2015-10-20 06:56:14 +00:00
}
@FXML
protected void compile(ActionEvent event){
//TODO
2015-10-20 06:56:14 +00:00
}
@FXML
protected void changeProject(ActionEvent event){
client.getProjectHandler().setProject(null);
2015-11-13 11:58:23 +01:00
client.getProjectHandler().triggerSelectProject();
}
@FXML
protected void exit(ActionEvent event){
client.exit();
}
2015-11-13 11:58:23 +01:00
private void sendProjectTypeReqMsg(String type){
CoderMessage msg = new CoderMessage();
msg.ProjectTypeReq = new ProjectTypeReqMsg();
msg.ProjectTypeReq.type = type;
client.getSessionHandler().sendMessage(msg);
}
2015-10-20 06:56:14 +00:00
private void setupFileTreeView(){
fileTreeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() {
@Override
public void changed(ObservableValue<? extends TreeItem<String>> item, TreeItem<String> oldValue, TreeItem<String> newValue) {
if(newValue != fileTreeView.getRoot()){
System.out.println("INFO: item " + newValue + " selected");
}
}
});
TreeItem<String> root = new TreeItem<String>("root");
root.setExpanded(true);
fileTreeView.setRoot(root);
}
private void setupPropertySheet(){
//handle custom ProperySheet.Item's editor
propertySheet.setPropertyEditorFactory(new Callback<PropertySheet.Item, PropertyEditor<?>>(){
@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<String> boards = new ArrayList<String>();
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
protected String getTitle() {
return "Coder Client";
}
private void setErrorMessage(String msg) {
// TODO Auto-generated method stub
}
@Override
protected String getDescriptiveName() {
return "Editor Window";
}
2015-10-20 06:56:14 +00:00
}