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 */
016package org.opengion.hayabusa.io;
017
018import javax.swing.tree.TreeModel;
019import javax.swing.tree.DefaultTreeModel;
020import javax.swing.tree.TreeNode;
021import javax.swing.tree.DefaultMutableTreeNode;
022import 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 */
036public 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}