import java.awt.Component;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class TextEdit extends JFrame implements ActionListener, TreeWillExpandListener{
//Menu
JMenuBar mb = new JMenuBar();
JMenu fileMenu = new JMenu("파일");
JMenuItem newMenuItem = new JMenuItem("새문서");
JMenuItem openMenuItem = new JMenuItem("열기");
JMenuItem saveMenuItem = new JMenuItem("저장");
JMenuItem endMenuItem = new JMenuItem("종료");
//Menu End
//Left
JSplitPane verticalSplit;
JScrollPane treeScroll, listScroll;
JTree tree;
DefaultMutableTreeNode root;
File file; //JTree에서 선택한 폴더를 저장할 변수
JList list;
DefaultListModel<String> listModel = new DefaultListModel<String>();
//Left end
//Right
JSplitPane horizontalSplit;
JDesktopPane dp = new JDesktopPane();
//Right end
int docNum = 1;
public TextEdit() {
super("편집기");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//menu
mb.add(fileMenu);
fileMenu.add(newMenuItem);
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.add(endMenuItem);
setJMenuBar(mb);
newMenuItem.addActionListener(this);
openMenuItem.addActionListener(this);
saveMenuItem.addActionListener(this);
endMenuItem.addActionListener(this);
//menu end
//Left
root = new DefaultMutableTreeNode("내컴퓨터");
makeDir(); //drive 만들기
tree = new JTree(root, true);
treeScroll = new JScrollPane(tree);
tree.setCellRenderer(new FileRenderer());
tree.addTreeWillExpandListener(this); //JTree 이벤트 등록
list = new JList();
listScroll = new JScrollPane(list);
list.setModel(listModel);
//MouseEvent
MyMouseEvent me = new MyMouseEvent();
list.addMouseListener(me);
//MouseEvent end
verticalSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT, treeScroll, listScroll);
verticalSplit.setDividerLocation(200);
//Left end
//right
horizontalSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, verticalSplit, dp);
//right end
add(horizontalSplit, "Center");
setSize(800, 700);
setVisible(true);
}
//오버라이딩
public void actionPerformed(ActionEvent ae){
String eventStr = ae.getActionCommand();
if(eventStr.equals("새문서")){
newDocument();
}else if(eventStr.equals("열기")){
openFile();
}else if(eventStr.equals("저장")){
saveFile();
}else if(eventStr.equals("종료")){
dispose();
System.exit(0);
}
}
public void treeWillExpand(TreeExpansionEvent te){ //폴더 확장 시 호출
TreePath tPath = te.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tPath.getLastPathComponent();
Object obj = node.getUserObject(); //
if(obj instanceof File){
file = (File)obj;
if(file.isDirectory()){ //JTree에서 구한 File 객체가 폴더면
File[] f = file.listFiles();//하위 폴더와 파일 목록 구하기
listModel.removeAllElements();//JList 초기화
for(int i=0; i<f.length; i++){
if(f[i].isDirectory() && !f[i].isHidden()){ //폴더인 경우
DefaultMutableTreeNode insertNode = new DefaultMutableTreeNode(f[i]);
node.add(insertNode);
}else if(f[i].isFile() && !f[i].isHidden()){ //파일인 경우
listModel.addElement(f[i].getName());
}
}
list.setModel(listModel);
}
}
}
public void treeWillCollapse(TreeExpansionEvent te){}
//FileRenderer
class FileRenderer extends DefaultTreeCellRenderer
{
public ImageIcon IconDirectory = new ImageIcon("image/icon.jpg");
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
{
File file;
if ((value instanceof DefaultMutableTreeNode) && (((DefaultMutableTreeNode)value).getUserObject() instanceof File))
{
JLabel label;
file = (File)((DefaultMutableTreeNode)value).getUserObject();
String fname = file.getName();
if ( fname.length() <= 0 )
label = (JLabel) super.getTreeCellRendererComponent(tree, file.getPath(), selected, expanded, leaf, row, hasFocus);
else
label = (JLabel) super.getTreeCellRendererComponent(tree, fname, selected, expanded, leaf, row, hasFocus);
if (file.isFile() == false)
label.setIcon(IconDirectory);
return label;
}
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
//MouseEvent 내부 클래스
class MyMouseEvent extends MouseAdapter{
public void mouseClicked(MouseEvent me){
if(me.getClickCount()==2){ //더블클릭
String filename = (String)list.getSelectedValue();
createInternalFrame(new File(file, filename));
}
}
}
//새문서
public void newDocument(){
JInternalFrame jif = new JInternalFrame("새문서"+docNum++, true, true, true, true);
JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta);
jif.add(sp);
jif.setBounds(docNum*20, docNum*20, 400, 400);
jif.setVisible(true);
dp.add(jif);
try{
jif.setSelected(true);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
//열기
public void openFile(){
JFileChooser fc = new JFileChooser();
int chooser = fc.showOpenDialog(this);
if(chooser==0){ //열기
File f = fc.getSelectedFile();
createInternalFrame(f);
}
}
//저장하기
public void saveFile(){
JFileChooser fc = new JFileChooser();
int status = fc.showSaveDialog(this);
if(status==0){ //저장
File f = fc.getSelectedFile();
JInternalFrame jif = dp.getSelectedFrame();
JTextArea ta = (JTextArea)jif.getFocusOwner();
try{
FileWriter fw = new FileWriter(f);
String writeStr = ta.getText();
fw.write(writeStr, 0, writeStr.length());
fw.flush();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
//인터널 프레임 생성
public void createInternalFrame(File file){
JInternalFrame jif = new JInternalFrame(file.getPath(), true, true, true, true);
JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta);
jif.add(sp);
jif.setSize(500, 500);
jif.setVisible(true);
dp.add(jif);
try{
jif.setSelected(true); //창 앞으로 출력
//io
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
while(true){
String readLine = br.readLine();
if(readLine==null){break;}
ta.append(readLine+"\n");
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
//드라이브 만들기
public void makeDir(){
try{
File dir[] = File.listRoots();
DefaultMutableTreeNode node;
for(int i=0; i<dir.length; i++){
node = new DefaultMutableTreeNode(dir[i]);
root.add(node);
}
}catch(Exception e){System.out.println(e.getMessage());}
}
public static void main(String[] args) {
new TextEdit();
}
}