/**
*
*/
package jSimMacs.display;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import jSimMacs.data.Project;
import jSimMacs.data.RemoteProject;
import jSimMacs.logic.JSimLogic;
import jSimMacs.logic.ProjectLocation;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
/**
* @author Sanjit Roopra
*
*/
public class SimpleProjectTree extends JTree implements TreeExpansionListener {
protected DefaultMutableTreeNode root;
protected DefaultMutableTreeNode localRoot;
protected DefaultMutableTreeNode sshRoot;
public SimpleProjectTree(DefaultMutableTreeNode root) {
super(root);
this.root = root;
localRoot = new DefaultMutableTreeNode("Local Projects");
sshRoot = new DefaultMutableTreeNode("Remote Projects");
root.add(localRoot);
root.add(sshRoot);
setup();
this.addTreeExpansionListener(this);
getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
}
public void setup() {
createProjectNodes(JSimLogic.getInstance().getWorkspaceDir());
createRemoteProjectNodes();
}
public void createRemoteProjectNodes() {
sshRoot.removeAllChildren();
for (RemoteProject remoteProject : JSimLogic.getInstance()
.getRemoteProjects()) {
JSimMutuableTreeNode node = null;
if (remoteProject.isOpenConnection()) {
node = new RemoteProjectMutuableTreeNode(JSimLogic
.getInstance().getDirectoryEntry(
remoteProject,
remoteProject.getPath()
+ remoteProject.getName()),
remoteProject);
sshRoot.add(node);
}
// else node = new RemoteProjectMutuableTreeNode(remoteProject);
// sshRoot.add(new ProjectEntryMutuableTreeNode);
}
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.nodeStructureChanged(sshRoot);
}
private void createProjectNodes(String dir) {
try {
if (dir != null) {
File userDir = new File(dir);
if (!userDir.isDirectory())
throw new Exception();
createNodes(userDir);
}
} catch (NullPointerException exc) {
System.out.println("Work directory not specified");
} catch (Exception exc) {
System.out.println("Work directory not valid or not specified");
}
}
private void createNodes(File userDir) {
try {
ArrayList<Project> localProjects = new ArrayList<Project>();
localRoot.removeAllChildren();
File[] directoryList = userDir.listFiles();
Arrays.sort(directoryList);
// directoryList = sort(directoryList);
for (int i = 0; i < directoryList.length; i++) {
if (directoryList[i].isDirectory()
&& !directoryList[i].isHidden()) {
Project project = new Project(directoryList[i].getName());
project.setLocation(ProjectLocation.LOCALE);
localProjects.add(project);
localRoot.add(new ProjectEntryMutuableTreeNode(
directoryList[i], project));
}
}
JSimLogic.getInstance().setLocalProjects(localProjects);
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.nodeStructureChanged(localRoot);
model.nodeStructureChanged(root);
} catch (Exception exc) {
exc.printStackTrace();
}
}
// protected boolean notConfigDir(File file) {
// return !file.getName().equals(JSimConstants.JSIMCONFIGDIR);
// }
public void updateTree(DefaultMutableTreeNode selectedNode) {
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.nodeChanged(selectedNode);
}
public void insertNode(DefaultMutableTreeNode selectedNode, String filePath) {
// selectedNode.add(new ProjectEntryMutuableTreeNode(new
// File(filePath)));
DefaultTreeModel model = (DefaultTreeModel) getModel();
if (selectedNode instanceof RemoteProjectMutuableTreeNode) {
RemoteProjectMutuableTreeNode rNode = (RemoteProjectMutuableTreeNode) selectedNode;
RemoteProject rProject = rNode.getRemoteProject();
JSimMutuableTreeNode node = new RemoteProjectMutuableTreeNode(
rProject, rNode.getPathString(), JSimLogic.getInstance()
.getDirectoryEntry(rProject, filePath));
model.insertNodeInto(node, selectedNode, selectedNode
.getChildCount());
} else {
JSimMutuableTreeNode jNode = (JSimMutuableTreeNode) selectedNode;
model.insertNodeInto(new ProjectEntryMutuableTreeNode(new File(
filePath), jNode.getProject()), selectedNode, selectedNode.getChildCount());
}
// model.nodeStructureChanged(selectedNode);
}
public void insertProjectNode(ProjectLocation location, Project project) {
DefaultTreeModel model = (DefaultTreeModel) getModel();
String dir = "";
if (location == ProjectLocation.LOCALE) {
dir += JSimLogic.getInstance().getWorkspaceDir()
+ project.getName();
JSimMutuableTreeNode node = new ProjectEntryMutuableTreeNode(
new File(dir), project);
model.insertNodeInto(node, localRoot, localRoot.getChildCount());
// int []childIndices = new int[1];
// childIndices[0] = localRoot.getChildCount()-1;
// model.nodesWereInserted(localRoot, childIndices);
} else if (location == ProjectLocation.SSH) {
RemoteProject remoteProject = (RemoteProject) project;
JSimMutuableTreeNode node = new RemoteProjectMutuableTreeNode(
JSimLogic.getInstance().getDirectoryEntry(remoteProject,
remoteProject.getPath() + remoteProject.getName()),
remoteProject);
model.insertNodeInto(node, sshRoot, sshRoot.getChildCount());
}
}
public void deleteNode(JSimMutuableTreeNode selectedNode) {
// selectedNode.add(new ProjectEntryMutuableTreeNode(new
// File(filePath)));
if (selectedNode.getLevel() == 2) {
JSimLogic.getInstance().removeRunOption(selectedNode.getProject());
if (selectedNode instanceof RemoteProjectMutuableTreeNode)
JSimLogic.getInstance().removeRemoteProject(
(RemoteProject) selectedNode.getProject());
}
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.removeNodeFromParent(selectedNode);
// model.nodeStructureChanged(selectedNode);
}
public void treeCollapsed(TreeExpansionEvent event) {
// TODO Auto-generated method stub
}
public void treeExpanded(TreeExpansionEvent event) {
try {
JSimMutuableTreeNode node = (JSimMutuableTreeNode) event.getPath()
.getLastPathComponent();
node.createNodes(false);
DefaultTreeModel model = (DefaultTreeModel) getModel();
model.nodeStructureChanged(node);
} catch (Exception exc) {
System.out.println("Tree initialized");
}
}
}