001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.io;
017
018 import javax.swing.tree.TreeModel;
019 import javax.swing.tree.DefaultTreeModel;
020 import javax.swing.tree.TreeNode;
021 import javax.swing.tree.DefaultMutableTreeNode;
022 import java.io.File;
023
024 /**
025 * å†?ƒ¨ã« TreeModel ã‚’æŒã£ãŸãƒ•ァイル階層表ç¾ã‚’表ã™ã‚¯ãƒ©ã‚¹ã§ã™ã?
026 * ルートディレクトリを指定ã—ã¦ã€ãれ以下ã?ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªéšŽå±¤ã‚’構築ã—ã¾ã™ã?
027 * ã“ã?クラスã¯?Œã™ã¹ã¦ã®ãƒ??タを走査ã—ã¦ã‹ã‚‰ã€TreeModel を構築ã—ã¾ã™ã?ã§ã€?
028 * パフォーマンスçš?«ã¯åŠ£ã‚Šã¾ã™ã?
029 *
030 * @og.group ãã?ä»–å?åŠ?
031 *
032 * @version 4.0
033 * @author Kazuhiko Hasegawa
034 * @since JDK5.0,
035 */
036 public class FileTreeModel {
037 TreeModel model = null;
038 String dir = null;
039
040 /**
041 * ãƒ?ƒ•ォルトコンストラクター
042 *
043 */
044 public FileTreeModel() {
045 initialise( null );
046 }
047
048 /**
049 * ルートディレクトリを指定ã—ã¦ã€TreeModel を構築ã™ã‚‹ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼
050 *
051 * @param dir ルートディレクトリæ–?—å?
052 */
053 public FileTreeModel( final String dir ) {
054 initialise( dir );
055 }
056
057 /**
058 * ルートディレクトリを指定ã—ã¦ã€TreeModel を構築ã—ã¾ã™ã?
059 *
060 * @param dir ルートディレクトリæ–?—å?
061 */
062 public void setDirectory( final String dir ) {
063 initialise( dir );
064 }
065
066 /**
067 * ルートディレクトリを指定ã—ã¦ã€TreeModel を構築ã—ã¾ã™ã?
068 *
069 * @param dir ルートディレクトリæ–?—å?
070 */
071 private void initialise( final String dir ) {
072 this.dir = dir;
073 if( this.dir == null ) { this.dir = "."; }
074 TreeNode root = makeTree( new File(this.dir) );
075 model = new DefaultTreeModel( root );
076 }
077
078 /**
079 * TreeModel ã‚’å–å¾—ã—ã¾ã™ã?
080 * コンストラクター ã¾ãŸã?ã€setDirectory()メソãƒ?ƒ‰ã«ã‚ˆã£ã¦æ§‹ç¯‰ã•れãŸ
081 * ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªéšŽå±¤ã‚?TreeModel ã«ãƒžãƒƒãƒ”ングã—ã¦è¿”ã—ã¾ã™ã?
082 *
083 * @return ルートディレクトリæ–?—å?
084 */
085 public TreeModel getTreeModel() {
086 return model;
087 }
088
089 /**
090 * å†?ƒ¨çš?« ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªéšŽå±¤ã‚’表ç¾ã—㟠TreeNode ã‚’è¿”ã—ã¾ã™ã?
091 *
092 * @param file ルートディレクトリã®ãƒ•ァイルオブジェクãƒ?
093 *
094 * @return ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªéšŽå±¤ã‚’表ç¾ã—ãŸTreeNode
095 */
096 private DefaultMutableTreeNode makeTree( final File file ) {
097 DefaultMutableTreeNode node = new DefaultMutableTreeNode( file.getName() );
098 if(file.isDirectory()) {
099 String[] list = file.list();
100 for( int i=0; i<list.length; i++ ) {
101 node.add( makeTree( new File(file, list[i]) ) );
102 }
103 }
104 return node;
105 }
106
107 /**
108 * Tree ã®è¡¨ç¤ºç”¨ãƒ¡ã‚½ãƒ?ƒ‰
109 *
110 * ã“れã¯ã€ãƒ†ã‚¹ãƒˆç”¨ã«ä½¿ç”¨ã™ã‚‹ãŸã‚ã® Tree を標準å?力㫠出力ã™ã‚‹ãƒ¡ã‚½ãƒ?ƒ‰ã§ã™ã?
111 *
112 * @param root トップレベルã®TreeNodeオブジェクãƒ?階層çš?«å°å—ã—ã¾ã™ã?)
113 * @param model TreeNodeã‚’å«ã‚?TreeModelオブジェクãƒ?
114 * @param level 階層レベル。ä¸?•ªãƒˆãƒƒãƒ—ã‚’ 0 レベルã¨ã™ã‚‹ã€?
115 */
116 public void printTree( final TreeNode root,final TreeModel model,final int level ) {
117 int num = model.getChildCount( root );
118 TreeNode[] nodes = new TreeNode[num];
119 for( int i=0; i<num; i++ ) {
120 nodes[i] = (TreeNode)model.getChild( root,i );
121 if( nodes[i].isLeaf() ) {
122 System.out.println( level + ":" + nodes[i].toString() );
123 }
124 else {
125 System.out.println( level + ":" + nodes[i].toString() );
126 printTree( nodes[i],model,level+1 );
127 }
128 }
129 }
130
131 /**
132 * main メソãƒ?ƒ‰
133 *
134 * ã“れã¯ã€ãƒ†ã‚¹ãƒˆç”¨ã«ä½¿ç”¨ã™ã‚‹ãŸã‚ã® main メソãƒ?ƒ‰ã§ã™ã?
135 *
136 * @param args 起動時ã®å¼•æ•° args[0] ã«ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå?
137 */
138 public static void main( final String[] args ) {
139 FileTreeModel fmodel = new FileTreeModel( args[0] );
140 TreeModel model = fmodel.getTreeModel();
141 TreeNode root = (TreeNode)model.getRoot() ;
142 fmodel.printTree( root,model,0 );
143 }
144 }