OSDN Git Service

オーバーライドしているメソッド全てに @Override アノテーションを追加した.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / tab / EditableTabbedPane.java
1 package jp.sourceforge.stigmata.ui.swing.tab;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.FocusTraversalPolicy;
8 import java.awt.Rectangle;
9 import java.awt.event.FocusAdapter;
10 import java.awt.event.FocusEvent;
11 import java.awt.event.KeyAdapter;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.MouseAdapter;
14 import java.awt.event.MouseEvent;
15
16 import javax.swing.BorderFactory;
17 import javax.swing.JFrame;
18 import javax.swing.JMenuBar;
19 import javax.swing.JTabbedPane;
20 import javax.swing.JTextField;
21
22 /**
23  * This program is copied from below URL.
24  * http://terai.xrea.jp/Swing/EditTabTitle.html
25  * 
26  * @author Haruaki Tamada
27  * @author Terai Atsuhiro
28  * @version $Revision$ 
29  */
30 public class EditableTabbedPane extends JTabbedPane{
31     private static final long serialVersionUID = -66174062280771547L;
32
33     private final EditableGlassPane panel;
34     private final JTextField editor;
35     private final JFrame frame;
36     private final FocusTraversalPolicy policy;
37     private FocusTraversalPolicy ftp;
38
39     public EditableTabbedPane(JFrame frame){
40         this.frame = frame;
41         this.panel = new EditableGlassPane(this);
42         this.editor = new JTextField();
43
44         policy = new EditableTabbedPaneFocusTraversalPolicy(editor);
45
46         editor.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3));
47         editor.addFocusListener(new FocusAdapter(){
48             @Override
49             public void focusGained(final FocusEvent e){
50                 ((JTextField)e.getSource()).selectAll();
51             }
52         });
53         editor.addKeyListener(new KeyAdapter(){
54             @Override
55             public void keyPressed(KeyEvent e){
56                 if(e.getKeyCode() == KeyEvent.VK_ENTER){
57                     renameTab();
58                 }
59                 else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
60                     cancelEditing();
61                 }
62             }
63         });
64         addMouseListener(new MouseAdapter(){
65             @Override
66             public void mouseClicked(MouseEvent me){
67                 if(me.getClickCount() == 2){
68                     startEditing();
69                 }
70             }
71         });
72         addKeyListener(new KeyAdapter(){
73             @Override
74             public void keyPressed(KeyEvent e){
75                 if(e.getKeyCode() == KeyEvent.VK_ENTER){
76                     startEditing();
77                 }
78             }
79         });
80
81         frame.setGlassPane(panel);
82         panel.add(editor);
83         panel.setVisible(false);
84     }
85
86     void renameTab(){
87         frame.setFocusTraversalPolicy(ftp);
88         if(editor.getText().trim().length() > 0){
89             setTitleAt(getSelectedIndex(), editor.getText());
90         }
91         panel.setVisible(false);
92     }
93
94     private void startEditing(){
95         initEditor();
96         ftp = frame.getFocusTraversalPolicy();
97         panel.setVisible(true);
98         editor.requestFocusInWindow();
99         frame.setFocusTraversalPolicy(policy);
100     }
101
102     private void cancelEditing(){
103         frame.setFocusTraversalPolicy(ftp);
104         panel.setVisible(false);
105     }
106
107     private void initEditor(){
108         JMenuBar bar = frame.getJMenuBar();
109         Rectangle rect = getUI().getTabBounds(this, getSelectedIndex());
110         rect.setRect(rect.x + 2, rect.y + 2, rect.width - 2, rect.height - 2);
111         if(bar != null){
112             rect.y += bar.getSize().height;
113         }
114         panel.setRectangle(rect);
115
116         editor.setBounds(rect);
117         editor.setText(getTitleAt(getSelectedIndex()));
118     }
119 }