package gui.panel;
import gui.UserGUI;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EtchedBorder;
import utils.MyFile;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
public class FileTreePanel extends JPanel {
private JTree tree;
private DefaultMutableTreeNode trunk;
private DefaultTreeModel treeModel;
private JLabel lblValname;
private JLabel lblValsize;
private JLabel lblValhidden;
private JLabel lblValaccess;
private JLabel lblVallastmodif;
private JButton btnDownload;
private UserGUI gui;
private HashMap<String, MyFile> fileMap = new HashMap<String, MyFile>();
private String selectedAbsolutePath;
private String selectedName;
private JTextField txtDir;
/**
* Create the panel.
*/
public FileTreePanel(UserGUI gui) {
this.gui = gui;
trunk = new DefaultMutableTreeNode("sdcard");
JLabel lblLeftclicToDownload = new JLabel(
"Left-clic to download a file :");
JSplitPane splitPane = new JSplitPane();
splitPane.setResizeWeight(0.9);
GroupLayout groupLayout = new GroupLayout(this);
groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(
Alignment.LEADING).addGroup(
groupLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
groupLayout
.createParallelGroup(Alignment.LEADING)
.addComponent(splitPane,
GroupLayout.DEFAULT_SIZE, 533,
Short.MAX_VALUE)
.addComponent(lblLeftclicToDownload))
.addContainerGap()));
groupLayout.setVerticalGroup(groupLayout.createParallelGroup(
Alignment.TRAILING).addGroup(
Alignment.LEADING,
groupLayout
.createSequentialGroup()
.addContainerGap()
.addComponent(lblLeftclicToDownload)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(splitPane, GroupLayout.DEFAULT_SIZE, 377,
Short.MAX_VALUE).addContainerGap()));
JPanel panel = new JPanel();
splitPane.setRightComponent(panel);
panel.setBorder(new TitledBorder(null, "Informations",
TitledBorder.LEADING, TitledBorder.TOP, null, null));
JButton btnTreeRequest = new JButton("Get FileTree");
btnTreeRequest.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireButtonRequestTree();
}
});
btnDownload = new JButton("Download File");
btnDownload.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireButtonDownload();
}
});
btnDownload.setEnabled(false);
JLabel lblName = new JLabel("Name :");
lblValname = new JLabel("val_name");
JLabel lblSize = new JLabel("Size :");
lblValsize = new JLabel("val_size");
JLabel lblHidden = new JLabel("Hidden :");
lblValhidden = new JLabel("val_hidden");
JLabel lblAccess = new JLabel("Access :");
lblValaccess = new JLabel("val_access");
JLabel lblLastModification = new JLabel("Last modification :");
lblVallastmodif = new JLabel("val_last_modif");
txtDir = new JTextField();
txtDir.setText("download/");
txtDir.setColumns(10);
JLabel lblDownloadDirectory = new JLabel("Download directory :");
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_panel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
.addComponent(btnDownload, GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
.addComponent(btnTreeRequest, GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
.addGroup(gl_panel.createSequentialGroup()
.addComponent(lblName)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblValname))
.addGroup(gl_panel.createSequentialGroup()
.addComponent(lblSize)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblValsize))
.addGroup(gl_panel.createSequentialGroup()
.addComponent(lblHidden)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblValhidden))
.addGroup(gl_panel.createSequentialGroup()
.addComponent(lblAccess)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblValaccess))
.addComponent(lblLastModification)
.addComponent(lblVallastmodif)
.addComponent(txtDir, GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)
.addComponent(lblDownloadDirectory))
.addContainerGap())
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_panel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
.addComponent(lblName)
.addComponent(lblValname))
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
.addComponent(lblSize)
.addComponent(lblValsize))
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
.addComponent(lblHidden)
.addComponent(lblValhidden))
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
.addComponent(lblAccess)
.addComponent(lblValaccess))
.addGap(32)
.addComponent(lblLastModification)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblVallastmodif)
.addPreferredGap(ComponentPlacement.RELATED, 77, Short.MAX_VALUE)
.addComponent(lblDownloadDirectory)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(txtDir, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnDownload)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnTreeRequest)
.addContainerGap())
);
panel.setLayout(gl_panel);
JScrollPane scrollPane = new JScrollPane();
splitPane.setLeftComponent(scrollPane);
tree = new JTree();
scrollPane.setViewportView(tree);
tree.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
fireClickNode(e);
}
});
treeModel = new DefaultTreeModel(trunk);
tree.setModel(treeModel);
setLayout(groupLayout);
this.init();
}
public void init() {
MyFile f0 = new MyFile(new File("src"));
MyFile f1 = new MyFile(new File("src/handler"));
MyFile f2 = new MyFile(new File("src/server/ClientHandler.java"));
MyFile f3 = new MyFile(new File("src/server"));
MyFile f4 = new MyFile(new File("src/server/Server.java"));
ArrayList<MyFile> listFile = new ArrayList<MyFile>();
listFile.add(f0);
listFile.add(f1);
listFile.add(f2);
listFile.add(f3);
listFile.add(f4);
this.updateFileTree(listFile);
}
public void updateFileTree(ArrayList<MyFile> fileList) {
File dir = null;
/*
for (MyFile file : fileList) {
if(file.getPath().equals("src")) dir = file.getFile();
}
*/
//dir = fileList.get(0).getFile();
treeModel = new DefaultTreeModel(this.addNodes(null, fileList.get(0)));
tree.setModel(treeModel);
repaint();
}
private DefaultMutableTreeNode addNodes(TreePath parentPath, MyFile cur) {
DefaultMutableTreeNode curNode = new DefaultMutableTreeNode(cur.getName());
TreePath path = new TreePath(curNode.getPath());
if(parentPath != null) {
parentPath = parentPath.pathByAddingChild(cur.getName());
fileMap.put(parentPath.toString(), cur);
} else {
fileMap.put(path.toString(), cur);
parentPath = new TreePath(curNode.getPath());
}
if(cur.getList() != null) {
for(MyFile child : cur.getList()) {
curNode.add(addNodes(parentPath, child));
}
}
return curNode;
}
private void fireClickNode(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if (path != null) {
/*
Object[] sPath = path.getPath();
String completePath = "";
for(int i = 0; i < sPath.length; i++) completePath += sPath[i]+"";
*/
MyFile f = fileMap.get(path.toString());
if(f != null) {
selectedAbsolutePath = f.getPath();
selectedName = f.getName();
lblValname.setText(f.getName());
lblValhidden.setText(""+f.isHidden());
lblVallastmodif.setText(""+(new Date(f.getLastModif())));
String sLength = "";
String temp = String.valueOf(f.getLength());
if(f.getLength() > 1024) sLength = String.valueOf(f.getLength()).substring(0, temp.length() - 3) + "Kb";
else if(f.getLength() > 1024000) sLength = String.valueOf(f.getLength()).substring(0, temp.length() - 6) + "Mb";
else if(f.getLength() > 1024000000) sLength = String.valueOf(f.getLength()).substring(0, temp.length() - 9) + "Tb";
else sLength = temp + " bytes";
lblValsize.setText(sLength);
String sAccess = "";
if(f.isR() && f.isW()) sAccess = "read & write";
else if(f.isR()) sAccess = "read";
else if(f.isW()) sAccess = "write";
lblValaccess.setText(sAccess);
btnDownload.setEnabled(true);
} else {
System.out.println("MyFile null => anormal");
selectedAbsolutePath = null;
lblValname.setText("n/a");
lblValhidden.setText("n/a");
lblVallastmodif.setText("n/a");
lblValsize.setText("n/a");
lblValaccess.setText("n/a");
btnDownload.setEnabled(false);
}
} else {
selectedAbsolutePath = null;
lblValname.setText("n/a");
lblValhidden.setText("n/a");
lblVallastmodif.setText("n/a");
lblValsize.setText("n/a");
lblValaccess.setText("n/a");
btnDownload.setEnabled(false);
}
}
}
private void fireButtonDownload() {
gui.fireFileDownload(selectedAbsolutePath, txtDir.getText(), selectedName);
}
private void fireButtonRequestTree() {
gui.fireTreeFile();
}
}