|
|
|
@ -1,5 +1,18 @@
|
|
|
|
|
package com.fr.design.gui.itree.filetree; |
|
|
|
|
|
|
|
|
|
import com.fr.base.BaseUtils; |
|
|
|
|
import com.fr.design.i18n.Toolkit; |
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
import com.fr.stable.ArrayUtils; |
|
|
|
|
import com.fr.stable.project.ProjectConstants; |
|
|
|
|
|
|
|
|
|
import javax.swing.Icon; |
|
|
|
|
import javax.swing.JTree; |
|
|
|
|
import javax.swing.filechooser.FileSystemView; |
|
|
|
|
import javax.swing.tree.DefaultMutableTreeNode; |
|
|
|
|
import javax.swing.tree.DefaultTreeCellRenderer; |
|
|
|
|
import javax.swing.tree.DefaultTreeModel; |
|
|
|
|
import javax.swing.tree.TreePath; |
|
|
|
|
import java.awt.Color; |
|
|
|
|
import java.awt.Component; |
|
|
|
|
import java.awt.Font; |
|
|
|
@ -11,26 +24,12 @@ import java.util.Comparator;
|
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Stack; |
|
|
|
|
|
|
|
|
|
import javax.swing.Icon; |
|
|
|
|
import javax.swing.JTree; |
|
|
|
|
import javax.swing.filechooser.FileSystemView; |
|
|
|
|
import javax.swing.tree.DefaultMutableTreeNode; |
|
|
|
|
import javax.swing.tree.DefaultTreeCellRenderer; |
|
|
|
|
import javax.swing.tree.DefaultTreeModel; |
|
|
|
|
import javax.swing.tree.TreePath; |
|
|
|
|
|
|
|
|
|
import com.fr.base.BaseUtils; |
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
|
|
|
|
|
import com.fr.stable.ArrayUtils; |
|
|
|
|
import com.fr.stable.project.ProjectConstants; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* File Tree. |
|
|
|
|
*/ |
|
|
|
|
public class JFileTree extends AbstractFileTree { |
|
|
|
|
protected FileFilter fileFilter ; |
|
|
|
|
protected FileFilter fileFilter; |
|
|
|
|
|
|
|
|
|
public JFileTree() { |
|
|
|
|
this(null); |
|
|
|
@ -43,8 +42,8 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
private void init(FileFilter filter) { |
|
|
|
|
this.fileFilter = filter; |
|
|
|
|
|
|
|
|
|
DefaultTreeModel m_model = new DefaultTreeModel(new DefaultMutableTreeNode(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_My_Computer"))); |
|
|
|
|
this.setModel(m_model); |
|
|
|
|
DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode(Toolkit.i18nText("Fine-Design_Basic_My_Computer"))); |
|
|
|
|
this.setModel(treeModel); |
|
|
|
|
|
|
|
|
|
this.putClientProperty("JTree.lineStyle", "Angled"); |
|
|
|
|
|
|
|
|
@ -57,7 +56,7 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setRootFile(File rootFile) { |
|
|
|
|
setRootFiles(new File[] { rootFile }); |
|
|
|
|
setRootFiles(new File[]{rootFile}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setRootFiles(File[] rootFiles) { |
|
|
|
@ -65,8 +64,8 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); |
|
|
|
|
DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) m_model.getRoot(); |
|
|
|
|
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.getModel(); |
|
|
|
|
DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
|
|
|
rootTreeNode.removeAllChildren(); |
|
|
|
|
|
|
|
|
|
for (int k = 0; k < rootFiles.length; k++) { |
|
|
|
@ -78,7 +77,7 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// richer:不是LocalEnv根本就不会运行到这儿
|
|
|
|
|
m_model.reload(rootTreeNode); |
|
|
|
|
defaultTreeModel.reload(rootTreeNode); |
|
|
|
|
|
|
|
|
|
if (rootFiles.length == 1) { |
|
|
|
|
File expandFile = rootFiles[0]; |
|
|
|
@ -96,17 +95,14 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
|
|
|
|
|
public File getSelectedFile() { |
|
|
|
|
TreePath selectedTreePath = this.getSelectionPath(); |
|
|
|
|
if(selectedTreePath == null) { |
|
|
|
|
if (selectedTreePath == null) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DefaultMutableTreeNode currentTreeNode = this.getMutableTreeNode(selectedTreePath); |
|
|
|
|
StringBuffer fBuf = new StringBuffer(); |
|
|
|
|
while (true) { |
|
|
|
|
StringBuilder fBuf = new StringBuilder(); |
|
|
|
|
while (currentTreeNode != null) { |
|
|
|
|
// 如果已经到了根节点,直接退出.
|
|
|
|
|
if (currentTreeNode == null) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Object object = currentTreeNode.getUserObject(); |
|
|
|
|
if (object instanceof RootFile) { |
|
|
|
@ -128,6 +124,7 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 通过文件夹寻找展开路径 |
|
|
|
|
* |
|
|
|
|
* @param currentFile 当前文件 |
|
|
|
|
*/ |
|
|
|
|
public void selectFile(File currentFile) { |
|
|
|
@ -181,16 +178,15 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 列出当前所有的File |
|
|
|
|
* |
|
|
|
|
* @param currentTreeNode 当前文件节点 |
|
|
|
|
* @return 当前节点下的所有File |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public FileDirectoryNode[] listFileNodes(DefaultMutableTreeNode currentTreeNode) { |
|
|
|
|
StringBuffer fBuf = new StringBuffer(); |
|
|
|
|
while (true) { |
|
|
|
|
StringBuilder fBuf = new StringBuilder(); |
|
|
|
|
while (currentTreeNode != null) { |
|
|
|
|
// 如果已经到了根节点,直接退出.
|
|
|
|
|
if (currentTreeNode == null) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
Object object = currentTreeNode.getUserObject(); |
|
|
|
|
if (object instanceof RootFile) { |
|
|
|
|
RootFile rootFileNode = (RootFile) object; |
|
|
|
@ -199,7 +195,7 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
// 列出当前文件的所有子文件,要判断下是否是系统保护的文件 能否打开. 打不开的话显示为null
|
|
|
|
|
File[] files = currentFile.listFiles(); |
|
|
|
|
// 如果文件列表为null 或者为File[0] = []返回null
|
|
|
|
|
if (files == null ) { |
|
|
|
|
if (files == null) { |
|
|
|
|
return new FileDirectoryNode[0]; |
|
|
|
|
} |
|
|
|
|
List fileNodeList = new ArrayList(); |
|
|
|
@ -220,12 +216,12 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
FileDirectoryNode[] fileNodes = new FileDirectoryNode[fileNodeList.size()]; |
|
|
|
|
fileNodeList.toArray(fileNodes); |
|
|
|
|
// 对文件夹进行排序
|
|
|
|
|
Arrays.sort(fileNodes, new FileNodeComparator()); |
|
|
|
|
Arrays.sort(fileNodes, new FileDirectoryNodeComparator()); |
|
|
|
|
return fileNodes; |
|
|
|
|
} |
|
|
|
|
// 名字进行逐层反序的回加. 例: Doload ==> C:\java\Doload ,返回到文件夹的path,因为有可能是String. 所以加上instanceof
|
|
|
|
|
if (object instanceof FileDirectoryNode) { |
|
|
|
|
FileDirectoryNode nameNode = (FileDirectoryNode)object; |
|
|
|
|
FileDirectoryNode nameNode = (FileDirectoryNode) object; |
|
|
|
|
fBuf.insert(0, nameNode.getName()); |
|
|
|
|
fBuf.insert(0, "/"); |
|
|
|
|
} |
|
|
|
@ -240,6 +236,7 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
*/ |
|
|
|
|
private DefaultTreeCellRenderer fileTreeCellRenderer = new DefaultTreeCellRenderer() { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Component getTreeCellRendererComponent(JTree tree, Object value, |
|
|
|
|
boolean selected, boolean expanded, boolean leaf, int row, |
|
|
|
|
boolean hasFocus) { |
|
|
|
@ -247,11 +244,8 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
leaf, row, hasFocus); |
|
|
|
|
|
|
|
|
|
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value; |
|
|
|
|
StringBuffer fBuf = new StringBuffer(); |
|
|
|
|
while(true) { |
|
|
|
|
if (treeNode == null) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
StringBuilder fBuf = new StringBuilder(); |
|
|
|
|
while (treeNode != null) { |
|
|
|
|
Object userObj = treeNode.getUserObject(); |
|
|
|
|
if (userObj instanceof RootFile) { |
|
|
|
|
RootFile rootFileNode = (RootFile) userObj; |
|
|
|
@ -262,21 +256,21 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
// 得到本地tree图标
|
|
|
|
|
Icon tmpIcon = view.getSystemIcon(currentFile); |
|
|
|
|
if (currentFile.isDirectory() && fBuf.length() > 0) { |
|
|
|
|
tmpIcon=BaseUtils.readIcon("/com/fr/design/images/gui/folder.png"); |
|
|
|
|
tmpIcon = BaseUtils.readIcon("/com/fr/design/images/gui/folder.png"); |
|
|
|
|
} |
|
|
|
|
this.setIcon(tmpIcon); |
|
|
|
|
this.setName(null); |
|
|
|
|
Font oldFont = this.getFont(); |
|
|
|
|
if(ComparatorUtils.equals(currentFile.getName(), ProjectConstants.WEBINF_NAME)){ |
|
|
|
|
if (ComparatorUtils.equals(currentFile.getName(), ProjectConstants.WEBINF_NAME)) { |
|
|
|
|
this.setForeground(Color.blue); |
|
|
|
|
this.setFont(new Font(oldFont.getName(),1,oldFont.getSize())); |
|
|
|
|
}else{ |
|
|
|
|
this.setFont(new Font(oldFont.getName(),0,oldFont.getSize())); |
|
|
|
|
this.setFont(new Font(oldFont.getName(), Font.BOLD, oldFont.getSize())); |
|
|
|
|
} else { |
|
|
|
|
this.setFont(new Font(oldFont.getName(), Font.PLAIN, oldFont.getSize())); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 名字进行逐层反序的回加. 例: Doload ==> C:\java\Doload
|
|
|
|
|
if (userObj instanceof FileDirectoryNode ) { |
|
|
|
|
FileDirectoryNode nameNode = (FileDirectoryNode)userObj; |
|
|
|
|
if (userObj instanceof FileDirectoryNode) { |
|
|
|
|
FileDirectoryNode nameNode = (FileDirectoryNode) userObj; |
|
|
|
|
fBuf.insert(0, nameNode.getName()); |
|
|
|
|
fBuf.insert(0, "/"); |
|
|
|
|
} |
|
|
|
@ -289,9 +283,10 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 对文件夹进行排序 先文件夹 然后各种类型文件 |
|
|
|
|
* |
|
|
|
|
* @author kunsnat |
|
|
|
|
*/ |
|
|
|
|
public class FileNodeComparator implements Comparator { |
|
|
|
|
public class FileDirectoryNodeComparator implements Comparator<FileDirectoryNode> { |
|
|
|
|
/** |
|
|
|
|
* This method should return > 0 if v1 is greater than v2, 0 if |
|
|
|
|
* v1 is equal to v2, or < 0 if v1 is less than v2. |
|
|
|
@ -302,21 +297,19 @@ public class JFileTree extends AbstractFileTree {
|
|
|
|
|
* @param v2 comparison value.值2 |
|
|
|
|
* @return < 0, 0, or > 0 for v1<v2, v1==v2, or v1>v2 .值1大于值2返回大于0,相等返回0,小于和大于相反 |
|
|
|
|
*/ |
|
|
|
|
public int compare(Object v1, Object v2) { |
|
|
|
|
FileDirectoryNode nameNode1 = (FileDirectoryNode) v1; |
|
|
|
|
FileDirectoryNode nameNode2 = (FileDirectoryNode) v2; |
|
|
|
|
|
|
|
|
|
if (nameNode1.isDirectory()) { |
|
|
|
|
if (nameNode2.isDirectory()) { |
|
|
|
|
return nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); |
|
|
|
|
@Override |
|
|
|
|
public int compare(FileDirectoryNode v1, FileDirectoryNode v2) { |
|
|
|
|
if (v1.isDirectory()) { |
|
|
|
|
if (v2.isDirectory()) { |
|
|
|
|
return v1.getName().toLowerCase().compareTo(v2.getName().toLowerCase()); |
|
|
|
|
} else { |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (nameNode2.isDirectory()) { |
|
|
|
|
if (v2.isDirectory()) { |
|
|
|
|
return 1; |
|
|
|
|
} else { |
|
|
|
|
return nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); |
|
|
|
|
return v1.getName().toLowerCase().compareTo(v2.getName().toLowerCase()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|