]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/demo/rbnf/RbnfDemo.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / demo / rbnf / RbnfDemo.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2007, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.demo.rbnf;\r
8 \r
9 import java.awt.*;\r
10 import java.awt.event.*;\r
11 import java.text.DecimalFormat;\r
12 import java.text.BreakIterator;\r
13 import java.text.ParsePosition;\r
14 import java.util.Locale;\r
15 import com.ibm.icu.dev.demo.impl.*;\r
16 import com.ibm.icu.text.RuleBasedNumberFormat;\r
17 \r
18 public class RbnfDemo extends DemoApplet {\r
19     /**\r
20      * For serialization\r
21      */\r
22     private static final long serialVersionUID = -9119861296873763536L;\r
23 \r
24     /**\r
25      * Puts a copyright in the .class file\r
26      */\r
27 //    private static final String copyrightNotice\r
28 //        = "Copyright \u00a91997-1998 IBM Corp.  All rights reserved.";\r
29 \r
30     /*\r
31      * code to run the demo as an application\r
32      */\r
33     public static void main(String[] argv) {\r
34         new RbnfDemo().showDemo();\r
35     }\r
36 \r
37     protected Dimension getDefaultFrameSize(DemoApplet applet, Frame f) {\r
38         return new Dimension(430,270);\r
39     }\r
40 \r
41     protected Frame createDemoFrame(DemoApplet applet) {\r
42         final Frame window = new Frame("Number Spellout Demo");\r
43         window.setSize(800, 600);\r
44         window.setLayout(new BorderLayout());\r
45 \r
46         Panel mainPanel = new Panel();\r
47         mainPanel.setLayout(new GridLayout(1,2));\r
48 \r
49         commentaryField = new TextArea("", 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);\r
50         commentaryField.setSize(800, 50);\r
51         commentaryField.setText(RbnfSampleRuleSets.sampleRuleSetCommentary[0]);\r
52         commentaryField.setEditable(false);\r
53         commentaryField.setFont(new Font("Helvetica", Font.PLAIN, 14));\r
54 \r
55         spelloutFormatter = new RuleBasedNumberFormat(RbnfSampleRuleSets.usEnglish, Locale.US);\r
56         spelloutFormatter.setLenientParseMode(lenientParse);\r
57         populateRuleSetMenu();\r
58         numberFormatter = new DecimalFormat("#,##0.##########");\r
59         parsePosition = new ParsePosition(0);\r
60         theNumber = 0;\r
61 \r
62         numberField = new TextField();\r
63         numberField.setFont(new Font("Serif", Font.PLAIN, 24));\r
64         textField = new DemoTextFieldHolder();\r
65         textField.setFont(new Font("Serif", Font.PLAIN, 24));\r
66         rulesField = new DemoTextFieldHolder();\r
67         rulesField.setFont(new Font("Serif", Font.PLAIN, 14));\r
68         lenientParseButton = new Checkbox("Lenient parse", lenientParse);\r
69 \r
70         numberField.addTextListener(new TextListener() {\r
71             public void textValueChanged(TextEvent e) {\r
72                 if (!numberFieldHasFocus)\r
73                     return;\r
74 \r
75                 String fieldText = ((TextComponent)(e.getSource())).getText();\r
76                 parsePosition.setIndex(0);\r
77                 Number temp = numberFormatter.parse(fieldText, parsePosition);\r
78                 if (temp == null || parsePosition.getIndex() == 0) {\r
79                     theNumber = 0;\r
80                     textField.setText("PARSE ERROR");\r
81                 }\r
82                 else {\r
83                     theNumber = temp.doubleValue();\r
84                     textField.setText(spelloutFormatter.format(theNumber, ruleSetName));\r
85                 }\r
86             }\r
87         } );\r
88 \r
89         numberField.addFocusListener(new FocusAdapter() {\r
90             public void focusLost(FocusEvent e) {\r
91                 numberFieldHasFocus = false;\r
92                 numberField.setText(numberFormatter.format(theNumber));\r
93             }\r
94 \r
95             public void focusGained(FocusEvent e) {\r
96                 numberFieldHasFocus = true;\r
97                 numberField.selectAll();\r
98             }\r
99         } );\r
100 \r
101         textField.addKeyListener(new KeyAdapter() {\r
102             public void keyTyped(KeyEvent e) {\r
103                 if (e.getKeyChar() == '\t') {\r
104                     String fieldText = ((TextComponent)(e.getSource())).getText();\r
105                     parsePosition.setIndex(0);\r
106                     theNumber = spelloutFormatter.parse(fieldText, parsePosition)\r
107                                         .doubleValue();\r
108                     if (parsePosition.getIndex() == 0) {\r
109                         theNumber = 0;\r
110                         numberField.setText("PARSE ERROR");\r
111                         textField.selectAll();\r
112                     }\r
113                     else if (parsePosition.getIndex() < fieldText.length()) {\r
114                         textField.select(parsePosition.getIndex(), fieldText.length());\r
115                         numberField.setText(numberFormatter.format(theNumber));\r
116                     }\r
117                     else {\r
118                         textField.selectAll();\r
119                         numberField.setText(numberFormatter.format(theNumber));\r
120                     }\r
121                     e.consume();\r
122                 }\r
123             }\r
124         } );\r
125 \r
126         textField.addFocusListener(new FocusAdapter() {\r
127             public void focusLost(FocusEvent e) {\r
128                 String fieldText = ((TextComponent)(e.getSource())).getText();\r
129                 parsePosition.setIndex(0);\r
130                 theNumber = spelloutFormatter.parse(fieldText, parsePosition)\r
131                                 .doubleValue();\r
132                 if (parsePosition.getIndex() == 0)\r
133                     numberField.setText("PARSE ERROR");\r
134                 else\r
135                     numberField.setText(numberFormatter.format(theNumber));\r
136                 textField.setText(textField.getText()); // textField.repaint() didn't work right\r
137             }\r
138 \r
139             public void focusGained(FocusEvent e) {\r
140                 textField.selectAll();\r
141             }\r
142         } );\r
143 \r
144         rulesField.addKeyListener(new KeyAdapter() {\r
145             public void keyTyped(KeyEvent e) {\r
146                 if (e.getKeyChar() == '\t') {\r
147                     String fieldText = ((TextComponent)(e.getSource())).getText();\r
148                     if (formatterMenu.getSelectedItem().equals("Custom") || !fieldText.equals(\r
149                                     RbnfSampleRuleSets.sampleRuleSets[formatterMenu.getSelectedIndex()])) {\r
150                         try {\r
151                             RuleBasedNumberFormat temp = new RuleBasedNumberFormat(fieldText);\r
152                             temp.setLenientParseMode(lenientParse);\r
153                             populateRuleSetMenu();\r
154                             spelloutFormatter = temp;\r
155                             customRuleSet = fieldText;\r
156                             formatterMenu.select("Custom");\r
157                             commentaryField.setText(RbnfSampleRuleSets.\r
158                                 sampleRuleSetCommentary[RbnfSampleRuleSets.\r
159                                 sampleRuleSetCommentary.length - 1]);\r
160                             redisplay();\r
161                         }\r
162                         catch (Exception x) {\r
163                             textField.setText(x.toString());\r
164                         }\r
165                     }\r
166                     e.consume();\r
167                 }\r
168             }\r
169         } );\r
170 \r
171         rulesField.addFocusListener(new FocusAdapter() {\r
172             public void focusLost(FocusEvent e) {\r
173                 String fieldText = ((TextComponent)(e.getSource())).getText();\r
174                 if (formatterMenu.getSelectedItem().equals("Custom") || !fieldText.equals(\r
175                                 RbnfSampleRuleSets.sampleRuleSets[formatterMenu.getSelectedIndex()])) {\r
176                     try {\r
177                         RuleBasedNumberFormat temp = new RuleBasedNumberFormat(fieldText);\r
178                         temp.setLenientParseMode(lenientParse);\r
179                         populateRuleSetMenu();\r
180                         spelloutFormatter = temp;\r
181                         customRuleSet = fieldText;\r
182                         formatterMenu.select("Custom");\r
183                         redisplay();\r
184                     }\r
185                     catch (Exception x) {\r
186                         textField.setText(x.toString());\r
187                     }\r
188                 }\r
189                 rulesField.setText(rulesField.getText()); // rulesField.repaint() didn't work right\r
190             }\r
191         } );\r
192 \r
193         lenientParseButton.addItemListener(new ItemListener() {\r
194             public void itemStateChanged(ItemEvent e) {\r
195                 lenientParse = lenientParseButton.getState();\r
196                 spelloutFormatter.setLenientParseMode(lenientParse);\r
197             }\r
198         } );\r
199 \r
200         numberField.setText(numberFormatter.format(theNumber));\r
201         numberField.selectAll();\r
202         textField.setText(spelloutFormatter.format(theNumber, ruleSetName));\r
203 \r
204         Panel leftPanel = new Panel();\r
205         leftPanel.setLayout(new BorderLayout());\r
206         Panel panel = new Panel();\r
207         panel.setLayout(new BorderLayout());\r
208         Panel panel1 = new Panel();\r
209         panel1.setLayout(new GridLayout(3, 1));\r
210         panel1.add(new Panel());\r
211         panel1.add(numberField, "Center");\r
212         panel1.add(lenientParseButton);\r
213         panel.add(panel1, "Center");\r
214         Panel panel2 = new Panel();\r
215         panel2.setLayout(new GridLayout(3, 3));\r
216         Button button = new Button("+100");\r
217         button.addActionListener( new ActionListener() {\r
218             public void actionPerformed(ActionEvent e) {\r
219                 roll(100);\r
220             }\r
221         } );\r
222         panel2.add(button);\r
223         button = new Button("+10");\r
224         button.addActionListener( new ActionListener() {\r
225             public void actionPerformed(ActionEvent e) {\r
226                 roll(10);\r
227             }\r
228         } );\r
229         panel2.add(button);\r
230         button = new Button("+1");\r
231         button.addActionListener( new ActionListener() {\r
232             public void actionPerformed(ActionEvent e) {\r
233                 roll(1);\r
234             }\r
235         } );\r
236         panel2.add(button);\r
237         button = new Button("<");\r
238         button.addActionListener( new ActionListener() {\r
239             public void actionPerformed(ActionEvent e) {\r
240                 theNumber *= 10;\r
241                 redisplay();\r
242             }\r
243         } );\r
244         panel2.add(button);\r
245         panel2.add(new Panel());\r
246         button = new Button(">");\r
247         button.addActionListener( new ActionListener() {\r
248             public void actionPerformed(ActionEvent e) {\r
249                 theNumber /= 10;\r
250                 redisplay();\r
251             }\r
252         } );\r
253         panel2.add(button);\r
254         button = new Button("-100");\r
255         button.addActionListener( new ActionListener() {\r
256             public void actionPerformed(ActionEvent e) {\r
257                 roll(-100);\r
258             }\r
259         } );\r
260         panel2.add(button);\r
261         button = new Button("-10");\r
262         button.addActionListener( new ActionListener() {\r
263             public void actionPerformed(ActionEvent e) {\r
264                 roll(-10);\r
265             }\r
266         } );\r
267         panel2.add(button);\r
268         button = new Button("-1");\r
269         button.addActionListener( new ActionListener() {\r
270             public void actionPerformed(ActionEvent e) {\r
271                 roll(-1);\r
272             }\r
273         } );\r
274         panel2.add(button);\r
275         panel.add(panel2, "East");\r
276         leftPanel.add(panel, "North");\r
277         leftPanel.add(textField, "Center");\r
278 \r
279         Panel rightPanel = new Panel();\r
280         rightPanel.setLayout(new BorderLayout());\r
281         formatterMenu = new Choice();\r
282         for (int i = 0; i < RbnfSampleRuleSets.sampleRuleSetNames.length; i++)\r
283             formatterMenu.addItem(RbnfSampleRuleSets.sampleRuleSetNames[i]);\r
284         formatterMenu.addItem("Custom");\r
285         formatterMenu.addItemListener(new ItemListener() {\r
286             public void itemStateChanged(ItemEvent e) {\r
287                 Choice source = (Choice)(e.getSource());\r
288                 int item = source.getSelectedIndex();\r
289                 Locale locale = RbnfSampleRuleSets.sampleRuleSetLocales[item];\r
290 \r
291                 commentaryField.setText(RbnfSampleRuleSets.\r
292                                 sampleRuleSetCommentary[item]);\r
293 \r
294                 if (locale != null && (locale.getLanguage().equals("iw")\r
295                         || locale.getLanguage().equals("ru") || locale.getLanguage().equals("ja")\r
296                         || locale.getLanguage().equals("el")\r
297                         || locale.getLanguage().equals("zh"))) {\r
298                     textField.togglePanes(false);\r
299                     rulesField.togglePanes(false);\r
300                 }\r
301                 else {\r
302                     textField.togglePanes(true);\r
303                     rulesField.togglePanes(true);\r
304                 }\r
305 \r
306                 makeNewSpelloutFormatter();\r
307                 redisplay();\r
308             }\r
309         } );\r
310 \r
311         ruleSetMenu = new Choice();\r
312         populateRuleSetMenu();\r
313 \r
314         ruleSetMenu.addItemListener(new ItemListener() {\r
315             public void itemStateChanged(ItemEvent e) {\r
316                 ruleSetName = ruleSetMenu.getSelectedItem();\r
317                 redisplay();\r
318             }\r
319         } );\r
320 \r
321         Panel menuPanel = new Panel();\r
322         menuPanel.setLayout(new GridLayout(1, 2));\r
323         menuPanel.add(formatterMenu);\r
324         menuPanel.add(ruleSetMenu);\r
325         rightPanel.add(menuPanel, "North");\r
326 \r
327         rulesField.setText(RbnfSampleRuleSets.sampleRuleSets[formatterMenu.getSelectedIndex()]);\r
328         rightPanel.add(rulesField, "Center");\r
329 \r
330         mainPanel.add(leftPanel);\r
331         mainPanel.add(rightPanel);\r
332 \r
333         window.add(mainPanel, "Center");\r
334         window.add(commentaryField, "South");\r
335 \r
336         window.doLayout();\r
337         window.show();\r
338         final DemoApplet theApplet = applet;\r
339         window.addWindowListener(\r
340                 new WindowAdapter() {\r
341                     public void windowClosing(WindowEvent e) {\r
342                         setVisible(false);\r
343                         window.dispose();\r
344 \r
345                         if (theApplet != null) {\r
346                             theApplet.demoClosed();\r
347                         } else System.exit(0);\r
348                     }\r
349                 } );\r
350         return window;\r
351     }\r
352 \r
353     void roll(int delta) {\r
354         theNumber += delta;\r
355         redisplay();\r
356     }\r
357 \r
358     void redisplay() {\r
359         numberField.setText(numberFormatter.format(theNumber));\r
360         textField.setText(spelloutFormatter.format(theNumber, ruleSetName));\r
361     }\r
362 \r
363     void makeNewSpelloutFormatter() {\r
364         int item = formatterMenu.getSelectedIndex();\r
365         String formatterMenuItem = formatterMenu.getSelectedItem();\r
366 \r
367         if (formatterMenuItem.equals("Custom")) {\r
368             rulesField.setText(customRuleSet);\r
369             spelloutFormatter = new RuleBasedNumberFormat(customRuleSet);\r
370         }\r
371         else {\r
372             rulesField.setText(RbnfSampleRuleSets.sampleRuleSets[item]);\r
373 \r
374             Locale locale = RbnfSampleRuleSets.sampleRuleSetLocales[item];\r
375             if (locale == null)\r
376                 locale = Locale.getDefault();\r
377 \r
378             spelloutFormatter = new RuleBasedNumberFormat(RbnfSampleRuleSets.\r
379                             sampleRuleSets[item], locale);\r
380         }\r
381         spelloutFormatter.setLenientParseMode(lenientParse);\r
382         populateRuleSetMenu();\r
383     }\r
384 \r
385     void populateRuleSetMenu() {\r
386         String[] ruleSetNames = spelloutFormatter.getRuleSetNames();\r
387 \r
388         if (ruleSetMenu != null) {\r
389             ruleSetMenu.removeAll();\r
390             for (int i = 0; i < ruleSetNames.length; i++)\r
391                 ruleSetMenu.addItem(ruleSetNames[i]);\r
392 \r
393             ruleSetName = ruleSetMenu.getSelectedItem();\r
394         }\r
395         else\r
396             ruleSetName = ruleSetNames[0];\r
397     }\r
398 \r
399 //    private Frame demoWindow = null;\r
400 \r
401     private TextComponent numberField;\r
402     private DemoTextFieldHolder textField;\r
403     private DemoTextFieldHolder rulesField;\r
404     private TextComponent commentaryField;\r
405     private Checkbox lenientParseButton;\r
406 \r
407     private boolean numberFieldHasFocus = true;\r
408 \r
409     private RuleBasedNumberFormat spelloutFormatter;\r
410     private DecimalFormat numberFormatter;\r
411     private ParsePosition parsePosition;\r
412 \r
413     private boolean lenientParse = true;\r
414 \r
415     private double theNumber = 0;\r
416 //    private boolean canEdit = true;\r
417 \r
418     private Choice formatterMenu;\r
419     private Choice ruleSetMenu;\r
420     private String ruleSetName;\r
421 \r
422     private String customRuleSet = "NO RULES!";\r
423 }\r
424 \r
425 class DemoTextField extends Component {\r
426     /**\r
427      * For serialization\r
428      */\r
429     private static final long serialVersionUID = -7947090021239472658L;\r
430     public DemoTextField() {\r
431     }\r
432 \r
433     public void setText(String text) {\r
434         this.text = text;\r
435         this.repaint();\r
436     }\r
437 \r
438     public String getText() {\r
439         return text;\r
440     }\r
441 \r
442     public void paint(Graphics g) {\r
443         Font font = getFont();\r
444         FontMetrics fm = g.getFontMetrics();\r
445         g.setFont(font);\r
446         String txt = getText();\r
447         BreakIterator bi = BreakIterator.getLineInstance();\r
448         bi.setText(txt);\r
449         int lineHeight = fm.getHeight();\r
450         int width = getSize().width;\r
451         int penY = fm.getAscent();\r
452         int lineStart = 0;\r
453         int tempLineEnd = bi.first();\r
454         int lineEnd = 0;\r
455         int maxLineEnd = 0;\r
456         totalHeight = 0;\r
457 \r
458         while (lineStart < txt.length()) {\r
459             maxLineEnd = txt.indexOf('\n', lineStart);\r
460             if (maxLineEnd == -1)\r
461                 maxLineEnd = Integer.MAX_VALUE;\r
462             while (tempLineEnd != BreakIterator.DONE && fm.stringWidth(txt.substring(\r
463                             lineStart, tempLineEnd)) < width) {\r
464                 lineEnd = tempLineEnd;\r
465                 tempLineEnd = bi.next();\r
466             }\r
467             if (lineStart >= lineEnd) {\r
468                 if (tempLineEnd == BreakIterator.DONE)\r
469                     lineEnd = txt.length();\r
470                 else\r
471                     lineEnd = tempLineEnd;\r
472             }\r
473             if (lineEnd > maxLineEnd)\r
474                 lineEnd = maxLineEnd;\r
475             g.drawString(txt.substring(lineStart, lineEnd), 0, penY);\r
476             penY += lineHeight;\r
477             totalHeight += lineHeight;\r
478             lineStart = lineEnd;\r
479             if (lineStart < txt.length() && txt.charAt(lineStart) == '\n')\r
480                 ++lineStart;\r
481         }\r
482     }\r
483 \r
484 /*\r
485     public Dimension getPreferredSize() {\r
486         Dimension size = getParent().getSize();\r
487         return new Dimension(size.width, totalHeight);\r
488     }\r
489 */\r
490 \r
491     private String text;\r
492     private int totalHeight;\r
493 }\r
494 \r
495 class DemoTextFieldHolder extends Panel {\r
496     /**\r
497      * For serialization\r
498      */\r
499     private static final long serialVersionUID = 7514498764062569858L;\r
500     public DemoTextFieldHolder() {\r
501         tf1 = new TextArea("", 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);\r
502         tf2 = new DemoTextField();\r
503         sp = new ScrollPane();\r
504 \r
505         setLayout(new CardLayout());\r
506 \r
507         sp.add(tf2, "TextField1");\r
508         sp.setVisible(false);\r
509         add(tf1, "TestField2");\r
510         add(sp, "ScrollPane");\r
511     }\r
512 \r
513     public void addFocusListener(FocusListener l) {\r
514         tf1.addFocusListener(l);\r
515     }\r
516 \r
517     public void addKeyListener(KeyListener l) {\r
518         tf1.addKeyListener(l);\r
519     }\r
520 \r
521     public void setText(String text) {\r
522         tf1.setText(text);\r
523         tf2.setText(text);\r
524     }\r
525 \r
526     public String getText() {\r
527         return tf1.getText();\r
528     }\r
529 \r
530     public void select(int start, int end) {\r
531         tf1.select(start, end);\r
532     }\r
533 \r
534     public void selectAll() {\r
535         tf1.selectAll();\r
536     }\r
537 \r
538     public void togglePanes(boolean canShowRealTextField) {\r
539         if (canShowRealTextField != showingRealTextField) {\r
540             CardLayout layout = (CardLayout)(getLayout());\r
541             layout.next(this);\r
542             showingRealTextField = canShowRealTextField;\r
543         }\r
544     }\r
545 \r
546     private TextArea tf1 = null;\r
547     private DemoTextField tf2 = null;\r
548     private ScrollPane sp = null;\r
549     private boolean showingRealTextField = true;\r
550 }\r