OSDN Git Service

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