OSDN Git Service

chenge localization use resourcebundle
[posterdivider/PosterDivider.git] / src / jp / sourceforge / posterdivider / NumberField.java
1 //
2 // NumberField.java
3 // This file is part of PosterDivider.
4 //
5 package jp.sourceforge.posterdivider;
6
7 import java.awt.TextField;
8 import java.awt.event.ActionEvent;
9 import java.awt.event.ActionListener;
10 import java.awt.event.FocusEvent;
11 import java.awt.event.FocusListener;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.KeyListener;
14 import java.awt.event.TextEvent;
15 import java.awt.event.TextListener;
16 import java.text.DecimalFormat;
17 import java.util.regex.Matcher;
18 import java.util.regex.Pattern;
19
20 public class NumberField extends TextField {
21         private static final long serialVersionUID = 1L;
22         private static Pattern pattern = Pattern
23                         .compile("(-)?[0-9,]+(\\.[0-9,]+)?");
24         private static final double initValue = 0;
25
26         private static DecimalFormat createDecimalFormat(int digit) {
27                 DecimalFormat decimalFormat = new DecimalFormat();
28                 decimalFormat.setMaximumFractionDigits(digit);
29                 return decimalFormat;
30         }
31
32         private double value;
33         private double unitIncrement;// 上下キーを押したときに増減させる値 連続して押し続けると増減する値を増やす
34         private int displayDigit;// 小数点以下表示桁数
35         private DecimalFormat decimalFormat;
36         private boolean textChanged = false;
37         private boolean textChanging = false;
38         private int countIncrement = 0;// キーを連続して押した回数
39
40         private void updateText() {
41                 this.textChanging = true;
42                 super.setText(decimalFormat.format(value));
43                 this.textChanging = false;
44         }
45
46         private void refreshText() {
47                 if (textChanged) {
48                         this.setText(super.getText());
49                 }
50                 textChanged = false;
51         }
52
53         private void numberField_actionPerformed() {
54                 refreshText();
55         }
56
57         private void numberField_focusLost(FocusEvent e) {
58                 countIncrement = 0;
59                 if (textChanged) {
60                         processActionEvent(new ActionEvent(e.getSource(), e.getID(), ""));
61                 }
62                 // refreshText();
63         }
64
65         private void numberField_textChanged() {
66                 if (!textChanging) {
67                         this.textChanged = true;
68                 }
69         }
70
71         private void numberField_keyPressed(KeyEvent e) {
72                 switch (e.getKeyCode()) {
73                 case KeyEvent.VK_UP:
74                         if (countIncrement >= 19) {
75                                 setValue(this.value + this.unitIncrement * 100);
76                         } else if (countIncrement >= 10) {
77                                 setValue(this.value + this.unitIncrement * 10);
78                         } else {
79                                 setValue(this.value + this.unitIncrement);
80                         }
81                         countIncrement++;
82                         e.consume();
83                         break;
84                 case KeyEvent.VK_DOWN:
85                         if (countIncrement >= 19) {
86                                 setValue(this.value - this.unitIncrement * 100);
87                         } else if (countIncrement >= 10) {
88                                 setValue(this.value - this.unitIncrement * 10);
89                         } else {
90                                 setValue(this.value - this.unitIncrement);
91                         }
92                         countIncrement++;
93                         e.consume();
94                         break;
95                 case KeyEvent.VK_LEFT:
96                 case KeyEvent.VK_RIGHT:
97                 case KeyEvent.VK_BACK_SPACE:
98                 case KeyEvent.VK_DELETE:
99                 case KeyEvent.VK_ENTER:
100                         break;
101                 default:
102                         switch (e.getKeyChar()) {
103                         case '.':
104                         case '-':
105                         case '0':
106                         case '1':
107                         case '2':
108                         case '3':
109                         case '4':
110                         case '5':
111                         case '6':
112                         case '7':
113                         case '8':
114                         case '9':
115                                 break;
116                         default:
117                                 e.consume();
118                                 break;
119                         }
120                         break;
121                 }
122         }
123
124         private void numberField_keyReleased(KeyEvent e) {
125                 countIncrement = 0;
126         }
127
128         private void numberField_keyTyped(KeyEvent e) {
129                 e.consume();
130         }
131
132         public NumberField() {
133                 super();
134                 this.value = initValue;
135                 this.unitIncrement = 0;
136                 this.displayDigit = 0;
137                 this.decimalFormat = createDecimalFormat(0);
138
139                 this.addActionListener(new ActionListener() {
140                         public void actionPerformed(ActionEvent e) {
141                                 numberField_actionPerformed();
142                         }
143                 });
144                 this.addFocusListener(new FocusListener() {
145                         public void focusGained(FocusEvent e) {
146                         }
147
148                         public void focusLost(FocusEvent e) {
149                                 numberField_focusLost(e);
150                         }
151                 });
152                 this.addTextListener(new TextListener() {
153                         public void textValueChanged(TextEvent e) {
154                                 numberField_textChanged();
155                         }
156                 });
157                 this.addKeyListener(new KeyListener() {
158                         public void keyPressed(KeyEvent e) {
159                                 numberField_keyPressed(e);
160                         }
161
162                         public void keyReleased(KeyEvent e) {
163                                 numberField_keyReleased(e);
164                         }
165
166                         public void keyTyped(KeyEvent e) {
167                                 numberField_keyTyped(e);
168                         }
169                 });
170
171                 updateText();
172         }
173
174         public double getValue() {
175                 return this.value;
176         }
177
178         public void setValue(double value) {
179                 this.value = value;
180                 updateText();
181         }
182
183         @Override
184         public void setText(String s) {
185                 Matcher m = pattern.matcher(s);
186                 double value = m.find() ? Double.valueOf(m.group().replace(",", ""))
187                                 : initValue;
188                 this.value = value;
189                 updateText();
190         }
191
192         public double getUnitIncrement() {
193                 return this.unitIncrement;
194         }
195
196         public void setUnitIncrement(double unitIncrement) {
197                 this.unitIncrement = unitIncrement;
198         }
199
200         public int getDisplayDigit() {
201                 return this.displayDigit;
202         }
203
204         public void setDisplayDigit(int displayDigit) {
205                 this.displayDigit = displayDigit;
206                 this.decimalFormat = createDecimalFormat(displayDigit);
207                 updateText();
208         }
209 }