/*
????Copyright?(c)?2006?NEC?AeroSpace?Systems,?Ltd.??All?Rights?Reserved
*/


import ?java.awt.BorderLayout;
import ?java.awt.Color;
import ?java.awt.Component;
import ?java.awt.Dimension;
import ?java.awt.FlowLayout;
import ?java.awt.Frame;
import ?java.awt.Toolkit;
import ?java.awt.event.ActionEvent;
import ?java.awt.event.ActionListener;
import ?java.awt.event.MouseAdapter;
import ?java.awt.event.MouseEvent;
import ?java.io.File;
import ?java.io.IOException;

import ?javax.swing.BorderFactory;
import ?javax.swing.JButton;
import ?javax.swing.JDialog;
import ?javax.swing.JLabel;
import ?javax.swing.JPanel;
import ?javax.swing.JScrollPane;
import ?javax.swing.JTree;
import ?javax.swing.border.Border;
import ?javax.swing.event.TreeExpansionEvent;
import ?javax.swing.event.TreeExpansionListener;
import ?javax.swing.filechooser.FileSystemView;
import ?javax.swing.tree.DefaultMutableTreeNode;
import ?javax.swing.tree.DefaultTreeModel;
import ?javax.swing.tree.TreePath;
import ?javax.swing.tree.TreeSelectionModel;

/**
?*?<p>Used?for?select?a?folder?from?system.</p>
?*
?*?
@author ?wt
?*?
@version ?0.01
?
*/

public ? class ?FolderSelectDialog? extends ?JDialog? {
????
????
private ? static ? final ? long ?serialVersionUID? = ? 3281508190777386340L ;
????
// ????private?Frame?owner_;
???? private ? boolean ?isOKClick_? = ? false ;
????
private ?String?filepath_? = ? "" ;
????
private ?JLabel?path_? = ? new ?JLabel( " ? " );????????????
????
private ?JTree?tree_;
????
private ?Border?border_? = ?BorderFactory.createEtchedBorder(Color.white,? new ?Color( 148 ,? 145 ,? 140 ));
????
????
/**
?????*?<p>?弶婜壔梡儊僜僢僪.?</p>
?????*?
@param ?owner?This?dialog's?parent?Frame.
?????
*/

????
public ?FolderSelectDialog(Frame?owner,?String?title)? {?
????????
super (owner,? true );
// ????????owner_?=?owner;
????????setTitle(title);
????????init();
????????setToScreenCenter(
this );
????????setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
????}

????
????
private ? void ?init()? {
????????isOKClick_?
= ? false ;
????????JPanel?labelPanel?
= ? new ?JPanel( new ?FlowLayout(FlowLayout.LEFT));
????????labelPanel.setSize(
300 ,? 40 );
????????JPanel?buttonPanel?
= ? new ?JPanel( new ?FlowLayout(FlowLayout.RIGHT));
????????JLabel?current?
= ? new ?JLabel( " Current?Selection " );
????????labelPanel.setLayout(
new ?BorderLayout());
????????labelPanel.add(current,?BorderLayout.NORTH);
????????labelPanel.add(path_,?BorderLayout.SOUTH);

????????File[]?roots?
= ?( new ?PFileSystemView()).getRoots();
????????FileNode?nod?
= ? new ?FileNode?(roots[ 0 ]);
????????nod.explore();
????????tree_?
= ? new ?JTree( new ?DefaultTreeModel(nod));
????????tree_.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);?

????????JScrollPane?sp?
= ? new ?JScrollPane(tree_);
????????sp.setBorder(border_);
????????
????????labelPanel.setBorder(BorderFactory.createEmptyBorder(
0 ,? 19 ,? 0 ,? 0 ));
????????JButton?buttonOK?
= ? new ?JButton( " OK " );
????????buttonOK.setPreferredSize(
new ?Dimension( 70 ,? 25 ));
????????JButton?buttonCanel?
= ? new ?JButton( " Canel " );
????????buttonCanel.setPreferredSize(
new ?Dimension( 70 ,? 25 ));
????????buttonPanel.add(buttonOK);
????????buttonPanel.add(buttonCanel);
????????????
????????
// canel?action
????????buttonCanel.addActionListener( new ?ActionListener()? {
????????????
public ? void ?actionPerformed(ActionEvent?e)? {
????????????????isOKClick_?
= ? false ;
????????????????FolderSelectDialog.
this .hide();
????????????}

????????}
);????????
????????
// ok?action
????????buttonOK.addActionListener( new ?ActionListener()? {
????????????
public ? void ?actionPerformed(ActionEvent?e)? {
????????????????isOKClick_?
= ? true ;
????????????????FolderSelectDialog.
this .hide();
????????????}

????????}
);
????????tree_.setShowsRootHandles(
true );
????????tree_.addTreeExpansionListener(
new ?TreeExpansionListener()? {
????????????
public ? void ?treeCollapsed(TreeExpansionEvent?e)? {
????????????????
????????????}

????????????
public ? void ?treeExpanded?(TreeExpansionEvent?e)? {
????????????????TreePath?path?
= ?e.getPath();
????????????????FileNode?node?
= ?(FileNode)path.getLastPathComponent();
????????????????
if ?( ! node.isExplored())? {
????????????????????DefaultTreeModel?model?
= ?(
????????????????????(DefaultTreeModel)?tree_.getModel());
????????????????????node.explore();
????????????????????model.nodeStructureChanged(node);
????????????????}

????????????}
???????????????
????????}
);
????????tree_.addMouseListener(
new ?MouseAdapter()? {
????????????
public ? void ?mousePressed(MouseEvent?e)? {
????????????????JTree?tree?
= ?(JTree)e.getSource();
????????????????
int ?row? = ?tree.getRowForLocation(e.getX(),?e.getY());
????????????????
if ?(row? == ? - 1 )? {
????????????????????
return ;
????????????????}

????????????????TreePath?path?
= ?tree.getPathForRow(row);
????????????????
if ?(path? == ? null )? {
????????????????????
return ;
????????????????}

????????????????FileNode?node?
= ?(FileNode)path.getLastPathComponent();
????????????????
if ?(node? == ? null )? {
????????????????????
return ;
????????????????}

????????????????filepath_?
= ?node.getString();
????????????????path_.setText(filepath_);
????????????}

????????}
);????????
????????getContentPane().add(sp,?BorderLayout.CENTER);
????????getContentPane().add(labelPanel,?BorderLayout.NORTH);
????????getContentPane().add(buttonPanel,?BorderLayout.SOUTH);
????????setSize(
350 ,? 400 );
????????
this .setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
????}

????
????
public ? boolean ?isOKClick()? {
????????
return ?isOKClick_;
????}

????
/**
?????*?<p>When?user?click?'OK'?Button,?use?this?method?to?get?user?selected?path.</p>
?????*?
@return ?User?selected?folder?path.
?????
*/

????
public ?String?getSelectPath()? {
????????
return ?filepath_;
????}

????
????
public ? void ?setToScreenCenter(Component?component)? {
????????Toolkit?kit?
= ?Toolkit.getDefaultToolkit();
????????Dimension?screenSize?
= ?kit.getScreenSize();
????????
int ?screenHeight? = ?screenSize.height;
????????
int ?screenWidth?? = ?screenSize.width;
????????component.setLocation((screenWidth?
- ?component.getWidth())? / ? 2 ,?(screenHeight? - ?component.getHeight())? / ? 2 );
????}

????
????
class ?FileNode? extends ?DefaultMutableTreeNode? {

????????
private ? static ? final ? long ?serialVersionUID? = ? - 6700441318091474795L ;
????????
private ? boolean ?explored_? = ? false ;
????
????????
public ?FileNode(File?file)? {
????????????setUserObject?(file);
????????}

????????
public ? boolean ?getAllowChildren()? {
????????????
return ?isDirectory();
????????}

????????
public ? boolean ?isLeaf()? {
????????????
return ? ! isDirectory();
????????}


????????
public ?File?getFile()? {
????????????
return ?(File)getUserObject();
????????}

????????
public ? boolean ?isExplored()? {
????????????
return ?explored_;
????????}

????????
public ? boolean ?isDirectory()? {
????????????File?file?
= ?getFile();
????????????
return ?file.isDirectory();
????????}

????????
public ?String?toString()? {
????????????File?file?
= ?getFile?();
????????????String?filename?
= ?file.toString();
????????????
int ?index? = ?filename.lastIndexOf( " \\ " );
????????????
return ?(index? != ? - 1 ? && ?index? != ?filename.length()? - ? 1 )? ?
????????????????????????????????????????filename.substring(index?
+ ? 1 )?:
????????????????????????????????????????filename;
????????}

????????
public ?String?getString()? {
????????????File?file?
= ?getFile?();
????????????String?filename?
= ?file.getAbsolutePath();
????????????
return ?filename;
????????}

????????
public ? void ?explore()? {
????????????
if ?( ! isDirectory())? {
????????????????
return ;????
????????????}
????????
????????????
if ?( ! isExplored())? {
????????????????File?file?
= ?getFile?();
????????????????File?[]?children?
= ?file.listFiles();
????????????????
for ?( int ?i? = ? 0 ;?i? < ?children.length;? ++ i)? {
????????????????????
if ?(children[i].isDirectory())? {
????????????????????????add(
new ?FileNode?(children[i]));
????????????????????}

????????????????}
?
????????????????explored_?
= ? true ;
????????????}

????????}
?
????}

????
????
/**
?????*?<p>Implement?the?abstact?class?FileSystemView.</p>
?????*?
@author ?wangtong
?????
*/

????
class ?PFileSystemView? extends ?FileSystemView? {
????????
public ?File?createNewFolder(File?containingDir)? throws ?IOException? {
????????????
return ? null ;
????????}

????}

????
// ????public?static?void?main(String[]?args)?{
// ????????JFrame?f?=?new?JFrame("test");
// ????????JButton?bt?=?new?JButton("Check");
// ????????bt.addActionListener(new?ActionListener()?{
// ????????????public?void?actionPerformed(ActionEvent?e)?{
// ????????????????FolderSelectDialog?d?=?new?FolderSelectDialog(
// ????????????????????????(JFrame)?SwingUtilities.getWindowAncestor((JButton)?e
// ????????????????????????????????.getSource()),?"FOLDER");
// ????????????????d.show();
// ????????????????if?(d.isOKClick())?{
// ????????????????????System.out.println(d.getSelectPath());
// ????????????????}
// ????????????}
// ????????});
// ????????f.setContentPane(bt);
// ????????f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// ????????f.show();
// ????????f.pack();
// ????}
}