OSDN Git Service

a693e3a7b055e933c64b485f6c2006ca75d7e9fe
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / TextPopup.java
1 /*\r
2  * テキストコンポーネント用ポップアップメニュー\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2008 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.awt.Component;\r
11 import java.beans.PropertyChangeEvent;\r
12 import java.beans.PropertyChangeListener;\r
13 import javax.swing.Action;\r
14 import javax.swing.JPopupMenu;\r
15 import javax.swing.text.Document;\r
16 import javax.swing.text.JTextComponent;\r
17 \r
18 /**\r
19  * テキストコンポーネント用ポップアップメニュー。\r
20  * 各種クリップボード操作(カット、コピー、ペースト、etc.)を備える。\r
21  */\r
22 @SuppressWarnings("serial")\r
23 public class TextPopup extends JPopupMenu implements PropertyChangeListener{\r
24 \r
25     /** プロパティ変更イベントキー。 */\r
26     private static final String PROPERTY_UI = "UI";\r
27 \r
28     private final Action cutAction    = ClipboardAction.cutAction();\r
29     private final Action copyAction   = ClipboardAction.copyAction();\r
30     private final Action pasteAction  = ClipboardAction.pasteAction();\r
31     private final Action selallAction = ClipboardAction.selectallAction();\r
32 \r
33     /**\r
34      * コンストラクタ。\r
35      */\r
36     public TextPopup(){\r
37         super();\r
38 \r
39         buildMenu();\r
40 \r
41         return;\r
42     }\r
43 \r
44     /**\r
45      * メニューの構成を作る。\r
46      */\r
47     private void buildMenu(){\r
48         add(this.cutAction);\r
49         add(this.copyAction);\r
50         add(this.pasteAction);\r
51 \r
52         addSeparator();\r
53 \r
54         add(this.selallAction);\r
55 \r
56         return;\r
57     }\r
58 \r
59     /**\r
60      * テキストコンポーネントに選択中文字列があるか判定する。\r
61      * @param textComp テキストコンポーネント\r
62      * @return 選択中文字列があればtrue\r
63      */\r
64     protected boolean hasSelectedContent(JTextComponent textComp){\r
65         int selStart = textComp.getSelectionStart();\r
66         int selEnd   = textComp.getSelectionEnd();\r
67 \r
68         boolean result;\r
69         if(selStart == selEnd) result = false;\r
70         else                   result = true;\r
71 \r
72         return result;\r
73     }\r
74 \r
75     /**\r
76      * テキストコンポーネントに文字列があるか判定する。\r
77      * @param textComp テキストコンポーネント\r
78      * @return 文字列があればtrue\r
79      */\r
80     protected boolean hasContent(JTextComponent textComp){\r
81         Document document = textComp.getDocument();\r
82         int docLength = document.getLength();\r
83         if(docLength <= 0) return false;\r
84         return true;\r
85     }\r
86 \r
87     /**\r
88      * {@inheritDoc}\r
89      * ついでにL&F変更監視機構を仕込む。\r
90      * @param invoker {@inheritDoc}\r
91      */\r
92     @Override\r
93     public void setInvoker(Component invoker){\r
94         Component old = getInvoker();\r
95         if(old != null){\r
96             old.removePropertyChangeListener(this);\r
97         }\r
98 \r
99         super.setInvoker(invoker);\r
100 \r
101         if(invoker != null){\r
102             invoker.addPropertyChangeListener(PROPERTY_UI, this);\r
103         }\r
104 \r
105         return;\r
106     }\r
107 \r
108     /**\r
109      * {@inheritDoc}\r
110      * 文字列選択状況によって一部のポップアップメニューをマスクする。\r
111      * @param invoker {@inheritDoc}\r
112      * @param x {@inheritDoc}\r
113      * @param y {@inheritDoc}\r
114      */\r
115     @Override\r
116     public void show(Component invoker, int x, int y){\r
117         if( ! (invoker instanceof JTextComponent) ) return;\r
118         JTextComponent textComp = (JTextComponent) invoker;\r
119 \r
120         boolean textSelected = hasSelectedContent(textComp);\r
121         this.cutAction .setEnabled(textSelected);\r
122         this.copyAction.setEnabled(textSelected);\r
123 \r
124         if( ! textComp.isEditable() ){\r
125             this.cutAction   .setEnabled(false);\r
126             this.pasteAction .setEnabled(false);\r
127         }\r
128 \r
129         if(hasContent(textComp)){\r
130             this.selallAction.setEnabled(true);\r
131         }else{\r
132             this.selallAction.setEnabled(false);\r
133         }\r
134 \r
135         super.show(invoker, x, y);\r
136 \r
137         return;\r
138     }\r
139 \r
140     /**\r
141      * {@inheritDoc}\r
142      * ポップアップ呼び出し元を監視してL&Fを変更する。\r
143      * @param event {@inheritDoc}\r
144      */\r
145     public void propertyChange(PropertyChangeEvent event){\r
146         String propertyName = event.getPropertyName();\r
147         if(PROPERTY_UI.equals(propertyName)) updateUI();\r
148         return;\r
149     }\r
150 \r
151     // TODO アクセス権チェックによるポップアップメニュー変更\r
152 }\r