2 *******************************************************************************
\r
3 * Copyright (C) 1996-2007, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.demo.rbnf;
\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
18 public class RbnfDemo extends DemoApplet {
\r
22 private static final long serialVersionUID = -9119861296873763536L;
\r
25 * Puts a copyright in the .class file
\r
27 // private static final String copyrightNotice
\r
28 // = "Copyright \u00a91997-1998 IBM Corp. All rights reserved.";
\r
31 * code to run the demo as an application
\r
33 public static void main(String[] argv) {
\r
34 new RbnfDemo().showDemo();
\r
37 protected Dimension getDefaultFrameSize(DemoApplet applet, Frame f) {
\r
38 return new Dimension(430,270);
\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
46 Panel mainPanel = new Panel();
\r
47 mainPanel.setLayout(new GridLayout(1,2));
\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
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
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
70 numberField.addTextListener(new TextListener() {
\r
71 public void textValueChanged(TextEvent e) {
\r
72 if (!numberFieldHasFocus)
\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
80 textField.setText("PARSE ERROR");
\r
83 theNumber = temp.doubleValue();
\r
84 textField.setText(spelloutFormatter.format(theNumber, ruleSetName));
\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
95 public void focusGained(FocusEvent e) {
\r
96 numberFieldHasFocus = true;
\r
97 numberField.selectAll();
\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
108 if (parsePosition.getIndex() == 0) {
\r
110 numberField.setText("PARSE ERROR");
\r
111 textField.selectAll();
\r
113 else if (parsePosition.getIndex() < fieldText.length()) {
\r
114 textField.select(parsePosition.getIndex(), fieldText.length());
\r
115 numberField.setText(numberFormatter.format(theNumber));
\r
118 textField.selectAll();
\r
119 numberField.setText(numberFormatter.format(theNumber));
\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
132 if (parsePosition.getIndex() == 0)
\r
133 numberField.setText("PARSE ERROR");
\r
135 numberField.setText(numberFormatter.format(theNumber));
\r
136 textField.setText(textField.getText()); // textField.repaint() didn't work right
\r
139 public void focusGained(FocusEvent e) {
\r
140 textField.selectAll();
\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
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
162 catch (Exception x) {
\r
163 textField.setText(x.toString());
\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
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
185 catch (Exception x) {
\r
186 textField.setText(x.toString());
\r
189 rulesField.setText(rulesField.getText()); // rulesField.repaint() didn't work right
\r
193 lenientParseButton.addItemListener(new ItemListener() {
\r
194 public void itemStateChanged(ItemEvent e) {
\r
195 lenientParse = lenientParseButton.getState();
\r
196 spelloutFormatter.setLenientParseMode(lenientParse);
\r
200 numberField.setText(numberFormatter.format(theNumber));
\r
201 numberField.selectAll();
\r
202 textField.setText(spelloutFormatter.format(theNumber, ruleSetName));
\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
222 panel2.add(button);
\r
223 button = new Button("+10");
\r
224 button.addActionListener( new ActionListener() {
\r
225 public void actionPerformed(ActionEvent e) {
\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
236 panel2.add(button);
\r
237 button = new Button("<");
\r
238 button.addActionListener( new ActionListener() {
\r
239 public void actionPerformed(ActionEvent e) {
\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
253 panel2.add(button);
\r
254 button = new Button("-100");
\r
255 button.addActionListener( new ActionListener() {
\r
256 public void actionPerformed(ActionEvent e) {
\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
267 panel2.add(button);
\r
268 button = new Button("-1");
\r
269 button.addActionListener( new ActionListener() {
\r
270 public void actionPerformed(ActionEvent e) {
\r
274 panel2.add(button);
\r
275 panel.add(panel2, "East");
\r
276 leftPanel.add(panel, "North");
\r
277 leftPanel.add(textField, "Center");
\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
291 commentaryField.setText(RbnfSampleRuleSets.
\r
292 sampleRuleSetCommentary[item]);
\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
302 textField.togglePanes(true);
\r
303 rulesField.togglePanes(true);
\r
306 makeNewSpelloutFormatter();
\r
311 ruleSetMenu = new Choice();
\r
312 populateRuleSetMenu();
\r
314 ruleSetMenu.addItemListener(new ItemListener() {
\r
315 public void itemStateChanged(ItemEvent e) {
\r
316 ruleSetName = ruleSetMenu.getSelectedItem();
\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
327 rulesField.setText(RbnfSampleRuleSets.sampleRuleSets[formatterMenu.getSelectedIndex()]);
\r
328 rightPanel.add(rulesField, "Center");
\r
330 mainPanel.add(leftPanel);
\r
331 mainPanel.add(rightPanel);
\r
333 window.add(mainPanel, "Center");
\r
334 window.add(commentaryField, "South");
\r
338 final DemoApplet theApplet = applet;
\r
339 window.addWindowListener(
\r
340 new WindowAdapter() {
\r
341 public void windowClosing(WindowEvent e) {
\r
345 if (theApplet != null) {
\r
346 theApplet.demoClosed();
\r
347 } else System.exit(0);
\r
353 void roll(int delta) {
\r
354 theNumber += delta;
\r
359 numberField.setText(numberFormatter.format(theNumber));
\r
360 textField.setText(spelloutFormatter.format(theNumber, ruleSetName));
\r
363 void makeNewSpelloutFormatter() {
\r
364 int item = formatterMenu.getSelectedIndex();
\r
365 String formatterMenuItem = formatterMenu.getSelectedItem();
\r
367 if (formatterMenuItem.equals("Custom")) {
\r
368 rulesField.setText(customRuleSet);
\r
369 spelloutFormatter = new RuleBasedNumberFormat(customRuleSet);
\r
372 rulesField.setText(RbnfSampleRuleSets.sampleRuleSets[item]);
\r
374 Locale locale = RbnfSampleRuleSets.sampleRuleSetLocales[item];
\r
375 if (locale == null)
\r
376 locale = Locale.getDefault();
\r
378 spelloutFormatter = new RuleBasedNumberFormat(RbnfSampleRuleSets.
\r
379 sampleRuleSets[item], locale);
\r
381 spelloutFormatter.setLenientParseMode(lenientParse);
\r
382 populateRuleSetMenu();
\r
385 void populateRuleSetMenu() {
\r
386 String[] ruleSetNames = spelloutFormatter.getRuleSetNames();
\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
393 ruleSetName = ruleSetMenu.getSelectedItem();
\r
396 ruleSetName = ruleSetNames[0];
\r
399 // private Frame demoWindow = null;
\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
407 private boolean numberFieldHasFocus = true;
\r
409 private RuleBasedNumberFormat spelloutFormatter;
\r
410 private DecimalFormat numberFormatter;
\r
411 private ParsePosition parsePosition;
\r
413 private boolean lenientParse = true;
\r
415 private double theNumber = 0;
\r
416 // private boolean canEdit = true;
\r
418 private Choice formatterMenu;
\r
419 private Choice ruleSetMenu;
\r
420 private String ruleSetName;
\r
422 private String customRuleSet = "NO RULES!";
\r
425 class DemoTextField extends Component {
\r
427 * For serialization
\r
429 private static final long serialVersionUID = -7947090021239472658L;
\r
430 public DemoTextField() {
\r
433 public void setText(String text) {
\r
438 public String getText() {
\r
442 public void paint(Graphics g) {
\r
443 Font font = getFont();
\r
444 FontMetrics fm = g.getFontMetrics();
\r
446 String txt = getText();
\r
447 BreakIterator bi = BreakIterator.getLineInstance();
\r
449 int lineHeight = fm.getHeight();
\r
450 int width = getSize().width;
\r
451 int penY = fm.getAscent();
\r
453 int tempLineEnd = bi.first();
\r
455 int maxLineEnd = 0;
\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
467 if (lineStart >= lineEnd) {
\r
468 if (tempLineEnd == BreakIterator.DONE)
\r
469 lineEnd = txt.length();
\r
471 lineEnd = tempLineEnd;
\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
485 public Dimension getPreferredSize() {
\r
486 Dimension size = getParent().getSize();
\r
487 return new Dimension(size.width, totalHeight);
\r
491 private String text;
\r
492 private int totalHeight;
\r
495 class DemoTextFieldHolder extends Panel {
\r
497 * For serialization
\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
505 setLayout(new CardLayout());
\r
507 sp.add(tf2, "TextField1");
\r
508 sp.setVisible(false);
\r
509 add(tf1, "TestField2");
\r
510 add(sp, "ScrollPane");
\r
513 public void addFocusListener(FocusListener l) {
\r
514 tf1.addFocusListener(l);
\r
517 public void addKeyListener(KeyListener l) {
\r
518 tf1.addKeyListener(l);
\r
521 public void setText(String text) {
\r
526 public String getText() {
\r
527 return tf1.getText();
\r
530 public void select(int start, int end) {
\r
531 tf1.select(start, end);
\r
534 public void selectAll() {
\r
538 public void togglePanes(boolean canShowRealTextField) {
\r
539 if (canShowRealTextField != showingRealTextField) {
\r
540 CardLayout layout = (CardLayout)(getLayout());
\r
542 showingRealTextField = canShowRealTextField;
\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