From 9caad6b7142a86345dc8739125cfa4f9a9379ca9 Mon Sep 17 00:00:00 2001 From: dcollin Date: Mon, 16 Nov 2015 15:16:41 +0100 Subject: [PATCH] Editor can now send a FileReq and recieve a FileRsp. --- .../coder/client/gui/editor/EditorWindow.java | 66 +++++++++++++++---- .../client/gui/editor/FileTreeDirectory.java | 19 ++++++ .../coder/client/gui/editor/FileTreeFile.java | 26 ++++++++ .../coder/client/gui/editor/FileTreeItem.java | 18 +++++ .../client/session/FileRspMsgListener.java | 7 ++ src/com/coder/client/session/Session.java | 4 ++ 6 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 src/com/coder/client/gui/editor/FileTreeDirectory.java create mode 100644 src/com/coder/client/gui/editor/FileTreeFile.java create mode 100644 src/com/coder/client/gui/editor/FileTreeItem.java create mode 100644 src/com/coder/client/session/FileRspMsgListener.java diff --git a/src/com/coder/client/gui/editor/EditorWindow.java b/src/com/coder/client/gui/editor/EditorWindow.java index 61fadf9..84b882c 100644 --- a/src/com/coder/client/gui/editor/EditorWindow.java +++ b/src/com/coder/client/gui/editor/EditorWindow.java @@ -2,7 +2,6 @@ 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; @@ -17,12 +16,14 @@ import zutil.log.LogUtil; import com.coder.client.CoderClient; import com.coder.client.gui.GuiWindow; import com.coder.client.project.OpenProjectEventHandler; -import com.coder.client.property.CheckBoxProperty; import com.coder.client.property.CoderClientProperty; import com.coder.client.property.ComboBoxProperty; +import com.coder.client.session.FileRspMsgListener; import com.coder.client.session.ProjectRspMsgListener; import com.coder.client.session.ProjectTypeRspMsgListener; import com.coder.server.message.CoderMessage; +import com.coder.server.message.FileReqMsg; +import com.coder.server.message.FileRspMsg; import com.coder.server.message.ProjectReqMsg; import com.coder.server.message.ProjectRspMsg; import com.coder.server.message.ProjectTypeReqMsg; @@ -42,7 +43,7 @@ public class EditorWindow extends GuiWindow { public static final Logger logger = LogUtil.getLogger(); private CoderClient client; - @FXML private TreeView fileTreeView; + @FXML private TreeView fileTreeView; @FXML private TextArea editTextArea; @FXML private PropertySheet propertySheet; @FXML private Button compileButton; @@ -73,12 +74,12 @@ public class EditorWindow extends GuiWindow { client.showOnStage(EditorWindow.this); //TODO: show "loading project" popup instead //handle name and description - fileTreeView.getRoot().setValue(msg.name); //set file tree root name to the project name + fileTreeView.getRoot().setValue(new FileTreeDirectory(msg.name)); //set file tree root name to the project name String projectDescription = msg.description; //handle config propertySheet.getItems().clear(); - if(msg.config != null){ + if(msg.config != null){ //config is an optional parameter logger.fine("the project has a configuration - populating property sheet"); Enumeration propertyNames = (Enumeration) msg.config.propertyNames(); while(propertyNames.hasMoreElements()){ //populate propertySheet with all config elements @@ -100,6 +101,7 @@ public class EditorWindow extends GuiWindow { List fileList = msg.fileList; fileTreeView.getRoot().getChildren().clear(); for(String filePath : fileList){ + String fullPath = filePath; logger.finer("adding file \""+filePath+"\" to the file tree"); if(filePath.endsWith("/")){ logger.warning("file: \"" + filePath + "\" in file list is a directory and not a file. Currently not supported. Ignoring entry"); @@ -108,7 +110,7 @@ public class EditorWindow extends GuiWindow { if(filePath.startsWith("/")){ filePath = filePath.substring(1, filePath.length()); } - TreeItem tmpParent = fileTreeView.getRoot(); + TreeItem tmpParent = fileTreeView.getRoot(); String[] filePathSpilt = filePath.split("/"); for(int i = 0; i < filePathSpilt.length; ++i){ if(i < filePathSpilt.length-1){ @@ -119,7 +121,7 @@ public class EditorWindow extends GuiWindow { }else{ logger.finer("adding directory \""+directoryName+"\" to directory \""+tmpParent+"\""); } - TreeItem tmpChild = new TreeItem(directoryName); + TreeItem tmpChild = new TreeItem(new FileTreeDirectory(directoryName)); tmpParent.getChildren().add(tmpChild); tmpParent = tmpChild; }else{ @@ -134,12 +136,11 @@ public class EditorWindow extends GuiWindow { }else{ logger.finer("adding file \""+fileName+"\" to directory \""+tmpParent+"\""); } - TreeItem tmpChild = new TreeItem(fileName); + TreeItem tmpChild = new TreeItem(new FileTreeFile(fileName, fullPath)); tmpParent.getChildren().add(tmpChild); tmpParent = tmpChild; }else{ - int index = tmpParent.getChildren().indexOf(fileName); - tmpParent = tmpParent.getChildren().get(index); + logger.warning("The project seems to contain two or more files with the same location and name. The file tree presented may be missing files. duplicates not allowed."); } } } @@ -165,6 +166,28 @@ public class EditorWindow extends GuiWindow { } }); + client.getSessionHandler().addMessageListener(new FileRspMsgListener(){ + @Override + public void messageReceived(FileRspMsg msg) { + if(msg.error != null || msg.path == null){ + if(msg.error != null){ + logger.severe("recieved error message \""+msg.error+"\" the FileRspMsg"); + } + if(msg.path == null){ + logger.severe("recieved a file with a null path"); + setErrorMessage("ERROR: en error occured while loading a file"); + }else{ + setErrorMessage("ERROR: en error occured while loading the file: \""+msg.path+"\""); + } + return; + }else{ + setErrorMessage(""); + } + logger.fine("recieved file content for file: \""+msg.path+"\""); + //TODO: load file content to text area + } + }); + client.getProjectHandler().addprojectEventHandler(new OpenProjectEventHandler() { @Override public void openProject(String projectName) { @@ -218,16 +241,29 @@ public class EditorWindow extends GuiWindow { } private void setupFileTreeView(){ - fileTreeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener>() { + fileTreeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener>() { @Override - public void changed(ObservableValue> item, TreeItem oldValue, TreeItem newValue) { + public void changed(ObservableValue> item, TreeItem oldValue, TreeItem newValue) { if(newValue != fileTreeView.getRoot()){ - System.out.println("INFO: item " + newValue + " selected"); + FileTreeItem fileTreeItem = newValue.getValue(); + if(fileTreeItem.isDirectory()){ + FileTreeDirectory directory = (FileTreeDirectory)fileTreeItem; + logger.fine("directory " + directory.getName() + " selected in the file tree"); + System.out.println(); + }else{ + FileTreeFile file = (FileTreeFile)fileTreeItem; + logger.fine("file " + file.getName() + " selected in the file tree. The file has the full path: \""+file.getFullPath()+"\""); + //sending file request message + CoderMessage msg = new CoderMessage(); + msg.FileReq = new FileReqMsg(); + msg.FileReq.path = file.getFullPath(); + client.getSessionHandler().sendMessage(msg); + } } } }); - TreeItem root = new TreeItem("/"); + TreeItem root = new TreeItem(new FileTreeDirectory("/")); root.setExpanded(true); fileTreeView.setRoot(root); @@ -249,6 +285,7 @@ public class EditorWindow extends GuiWindow { propertySheet.getItems().clear(); + /* EXAMPLE CODE: ArrayList boards = new ArrayList(); boards.add("UNO"); boards.add("Mega"); @@ -257,6 +294,7 @@ public class EditorWindow extends GuiWindow { CheckBoxProperty p2 = new CheckBoxProperty("Melt?", false); propertySheet.getItems().add(p2); + */ } @Override diff --git a/src/com/coder/client/gui/editor/FileTreeDirectory.java b/src/com/coder/client/gui/editor/FileTreeDirectory.java new file mode 100644 index 0000000..483ca83 --- /dev/null +++ b/src/com/coder/client/gui/editor/FileTreeDirectory.java @@ -0,0 +1,19 @@ +package com.coder.client.gui.editor; + +public class FileTreeDirectory extends FileTreeItem { + + public FileTreeDirectory(String name) { + super(name); + } + + @Override + public boolean isFile() { + return false; + } + + @Override + public boolean isDirectory() { + return true; + } + +} diff --git a/src/com/coder/client/gui/editor/FileTreeFile.java b/src/com/coder/client/gui/editor/FileTreeFile.java new file mode 100644 index 0000000..c30f41c --- /dev/null +++ b/src/com/coder/client/gui/editor/FileTreeFile.java @@ -0,0 +1,26 @@ +package com.coder.client.gui.editor; + +public class FileTreeFile extends FileTreeItem { + + private String fullPath; + + public FileTreeFile(String name, String fullPath) { + super(name); + this.fullPath = fullPath; + } + + @Override + public boolean isFile() { + return true; + } + + @Override + public boolean isDirectory() { + return false; + } + + public String getFullPath(){ + return this.fullPath; + } + +} diff --git a/src/com/coder/client/gui/editor/FileTreeItem.java b/src/com/coder/client/gui/editor/FileTreeItem.java new file mode 100644 index 0000000..1fc0fb1 --- /dev/null +++ b/src/com/coder/client/gui/editor/FileTreeItem.java @@ -0,0 +1,18 @@ +package com.coder.client.gui.editor; + +public abstract class FileTreeItem { + private String name; + public FileTreeItem(String name){ + this.name = name; + } + public String getName(){ + return name; + } + + public String toString(){ + return getName(); + } + + public abstract boolean isFile(); + public abstract boolean isDirectory(); +} diff --git a/src/com/coder/client/session/FileRspMsgListener.java b/src/com/coder/client/session/FileRspMsgListener.java new file mode 100644 index 0000000..73594d5 --- /dev/null +++ b/src/com/coder/client/session/FileRspMsgListener.java @@ -0,0 +1,7 @@ +package com.coder.client.session; + +import com.coder.server.message.FileRspMsg; + +public interface FileRspMsgListener extends ProjectMessageListener { + public void messageReceived(FileRspMsg msg); +} diff --git a/src/com/coder/client/session/Session.java b/src/com/coder/client/session/Session.java index efc0d36..e2c3da9 100755 --- a/src/com/coder/client/session/Session.java +++ b/src/com/coder/client/session/Session.java @@ -225,6 +225,10 @@ public class Session extends Thread { logger.fine("The message contains a ProjectTypeRsp that is forwarded to listener: " + listener); ((ProjectTypeRspMsgListener)listener).messageReceived(msg.ProjectTypeRsp); } + if(msg.FileRsp != null && listener instanceof FileRspMsgListener){ + logger.fine("The message contains a FileRsp that is forwarded to listener: " + listener); + ((FileRspMsgListener)listener).messageReceived(msg.FileRsp); + } } } });