]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/demos/src/com/ibm/icu/dev/demo/calendar/CalendarCalc.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / demos / src / com / ibm / icu / dev / demo / calendar / CalendarCalc.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1997-2008, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 \r
8 package com.ibm.icu.dev.demo.calendar;\r
9 \r
10 import java.awt.Button;\r
11 import java.awt.Checkbox;\r
12 import java.awt.CheckboxGroup;\r
13 import java.awt.Choice;\r
14 import java.awt.Component;\r
15 import java.awt.Container;\r
16 import java.awt.FlowLayout;\r
17 import java.awt.Font;\r
18 import java.awt.Frame;\r
19 import java.awt.GridLayout;\r
20 import java.awt.Label;\r
21 import java.awt.Panel;\r
22 import java.awt.TextField;\r
23 import java.awt.event.ActionEvent;\r
24 import java.awt.event.ActionListener;\r
25 import java.awt.event.ItemEvent;\r
26 import java.awt.event.ItemListener;\r
27 import java.awt.event.KeyEvent;\r
28 import java.awt.event.WindowEvent;\r
29 import java.text.ParsePosition;\r
30 import java.util.Date;\r
31 import java.util.Locale;\r
32 \r
33 import javax.swing.JTextField;\r
34 \r
35 import com.ibm.icu.dev.demo.impl.DemoApplet;\r
36 import com.ibm.icu.dev.demo.impl.DemoUtility;\r
37 import com.ibm.icu.text.DateFormat;\r
38 import com.ibm.icu.text.SimpleDateFormat;\r
39 import com.ibm.icu.util.BuddhistCalendar;\r
40 import com.ibm.icu.util.Calendar;\r
41 import com.ibm.icu.util.GregorianCalendar;\r
42 import com.ibm.icu.util.HebrewCalendar;\r
43 import com.ibm.icu.util.IslamicCalendar;\r
44 import com.ibm.icu.util.JapaneseCalendar;\r
45 import com.ibm.icu.util.TimeZone;\r
46 \r
47 /**\r
48  * CalendarCalc demonstrates how Date/Time formatter works.\r
49  */\r
50 public class CalendarCalc extends DemoApplet\r
51 {\r
52     /**\r
53      * For serialization\r
54      */\r
55     private static final long serialVersionUID = 4540103433916539296L;\r
56 \r
57     /**\r
58      * The main function which defines the behavior of the MultiCalendarDemo\r
59      * applet when an applet is started.\r
60      */\r
61     public static void main(String argv[]) {\r
62         new CalendarCalc().showDemo();\r
63     }\r
64 \r
65     /**\r
66      * This creates a CalendarCalcFrame for the demo applet.\r
67      */\r
68     public Frame createDemoFrame(DemoApplet applet) {\r
69         return new CalendarCalcFrame(applet);\r
70     }\r
71 }\r
72 \r
73 /**\r
74  * A Frame is a top-level window with a title. The default layout for a frame\r
75  * is BorderLayout.  The CalendarCalcFrame class defines the window layout of\r
76  * MultiCalendarDemo.\r
77  */\r
78 class CalendarCalcFrame extends Frame implements ActionListener\r
79 {\r
80     /**\r
81      * For serialization\r
82      */\r
83     private static final long serialVersionUID = 8901485296258761846L;\r
84 \r
85     static final Locale[] locales = DemoUtility.getG7Locales();\r
86 \r
87     private DemoApplet              applet;\r
88     private long                    time = System.currentTimeMillis();\r
89 \r
90     private static final RollAddField kRollAddFields[] = {\r
91         new RollAddField(Calendar.YEAR,                 "Year" ),\r
92         new RollAddField(Calendar.MONTH,                "Month" ),\r
93         new RollAddField(Calendar.WEEK_OF_MONTH,        "Week of Month" ),\r
94         new RollAddField(Calendar.WEEK_OF_YEAR,         "Week of Year" ),\r
95         new RollAddField(Calendar.DAY_OF_MONTH,         "Day of Month" ),\r
96         new RollAddField(Calendar.DAY_OF_WEEK,          "Day of Week" ),\r
97         new RollAddField(Calendar.DAY_OF_WEEK_IN_MONTH, "Day of Week in Month" ),\r
98         new RollAddField(Calendar.DAY_OF_YEAR,          "Day of Year" ),\r
99         new RollAddField(Calendar.AM_PM,                "AM/PM" ),\r
100         new RollAddField(Calendar.HOUR_OF_DAY,          "Hour of day" ),\r
101         new RollAddField(Calendar.HOUR,                 "Hour" ),\r
102         new RollAddField(Calendar.MINUTE,               "Minute" ),\r
103         new RollAddField(Calendar.SECOND,               "Second" ),\r
104     };\r
105 \r
106     /**\r
107      * Constructs a new CalendarCalcFrame that is initially invisible.\r
108      */\r
109     public CalendarCalcFrame(DemoApplet applet)\r
110     {\r
111         super("Multiple Calendar Demo");\r
112         this.applet = applet;\r
113         init();\r
114         start();\r
115     }\r
116 \r
117     /**\r
118      * Initializes the applet. You never need to call this directly, it\r
119      * is called automatically by the system once the applet is created.\r
120      */\r
121     public void init()\r
122     {\r
123         buildGUI();\r
124 \r
125         patternText.setText( calendars[0].toPattern() );\r
126 \r
127         // Force an update of the display\r
128         cityChanged();\r
129         millisFormat();\r
130         enableEvents(KeyEvent.KEY_RELEASED);\r
131         enableEvents(WindowEvent.WINDOW_CLOSING);\r
132     }\r
133 \r
134     //------------------------------------------------------------\r
135     // package private\r
136     //------------------------------------------------------------\r
137     void addWithFont(Container container, Component foo, Font font) {\r
138         if (font != null)\r
139             foo.setFont(font);\r
140         container.add(foo);\r
141     }\r
142 \r
143     /**\r
144      * Called to start the applet. You never need to call this method\r
145      * directly, it is called when the applet's document is visited.\r
146      */\r
147     public void start()\r
148     {\r
149         // do nothing\r
150     }\r
151 \r
152     TextField patternText;\r
153 \r
154     Choice dateMenu;\r
155     Choice localeMenu;\r
156 \r
157     Button up;\r
158     Button down;\r
159 \r
160     Checkbox getRoll;\r
161     Checkbox getAdd;\r
162 \r
163     public void buildGUI()\r
164     {\r
165         setBackground(DemoUtility.bgColor);\r
166         setLayout(new FlowLayout()); // shouldn't be necessary, but it is.\r
167 \r
168 // TITLE\r
169         Label label1=new Label("Calendar Converter", Label.CENTER);\r
170         label1.setFont(DemoUtility.titleFont);\r
171         add(label1);\r
172         add(DemoUtility.createSpacer());\r
173 \r
174 // IO Panel\r
175         Panel topPanel = new Panel();\r
176         topPanel.setLayout(new FlowLayout());\r
177 \r
178         CheckboxGroup group1= new CheckboxGroup();\r
179 \r
180         // Set up the controls for each calendar we're demonstrating\r
181         for (int i = 0; i < calendars.length; i++)\r
182         {\r
183             Label label = new Label(calendars[i].name, Label.RIGHT);\r
184             label.setFont(DemoUtility.labelFont);\r
185             topPanel.add(label);\r
186 \r
187             topPanel.add(calendars[i].text);\r
188 \r
189             final int j = i;\r
190             calendars[i].text.addActionListener( new ActionListener() {\r
191                 public void actionPerformed(ActionEvent e) {\r
192                     textChanged(j);\r
193                 }\r
194             } );\r
195 \r
196             calendars[i].rollAdd.setCheckboxGroup(group1);\r
197             topPanel.add(calendars[i].rollAdd);\r
198         }\r
199         calendars[0].rollAdd.setState(true);    // Make the first one selected\r
200 \r
201         Label label4=new Label("Pattern", Label.RIGHT);\r
202         label4.setFont(DemoUtility.labelFont);\r
203         topPanel.add(label4);\r
204 \r
205         patternText=new TextField(FIELD_COLUMNS);\r
206         patternText.setFont(DemoUtility.editFont);\r
207         topPanel.add(patternText);\r
208         topPanel.add(new Label(""));\r
209 \r
210         DemoUtility.fixGrid(topPanel,3);\r
211         add(topPanel);\r
212         add(DemoUtility.createSpacer());\r
213 \r
214 // ROLL / ADD\r
215         Panel rollAddPanel=new Panel();\r
216         {\r
217             rollAddPanel.setLayout(new FlowLayout());\r
218 \r
219             Panel rollAddBoxes = new Panel();\r
220             {\r
221                 rollAddBoxes.setLayout(new GridLayout(2,1));\r
222                 CheckboxGroup group2= new CheckboxGroup();\r
223                 getRoll = new Checkbox("Roll",group2, false);\r
224                 getAdd = new Checkbox("Add",group2, true);\r
225 \r
226                 rollAddBoxes.add(getRoll);\r
227                 rollAddBoxes.add(getAdd);\r
228             }\r
229 \r
230             Label dateLabel=new Label("Date Fields");\r
231             dateLabel.setFont(DemoUtility.labelFont);\r
232 \r
233             dateMenu= new Choice();\r
234             dateMenu.setBackground(DemoUtility.choiceColor);\r
235             for (int i = 0; i < kRollAddFields.length; i++) {\r
236                 dateMenu.addItem(kRollAddFields[i].name);\r
237                 if (kRollAddFields[i].field == Calendar.MONTH) {\r
238                     dateMenu.select(i);\r
239                 }\r
240             }\r
241 \r
242             Panel upDown = new Panel();\r
243             {\r
244                 upDown.setLayout(new GridLayout(2,1));\r
245 \r
246                 // *** If the images are not found, we use the label.\r
247                 up = new Button("^");\r
248                 down = new Button("v");\r
249                 up.setBackground(DemoUtility.bgColor);\r
250                 down.setBackground(DemoUtility.bgColor);\r
251                 upDown.add(up);\r
252                 upDown.add(down);\r
253                 up.addActionListener(this);\r
254                 down.addActionListener(this);\r
255             }\r
256 \r
257             rollAddPanel.add(dateLabel);\r
258             rollAddPanel.add(dateMenu);\r
259             rollAddPanel.add(rollAddBoxes);\r
260             rollAddPanel.add(upDown);\r
261 \r
262         }\r
263         Panel localePanel = new Panel();\r
264         {\r
265             // Make the locale popup menus\r
266             localeMenu= new Choice();\r
267             Locale defaultLocale = Locale.getDefault();\r
268             int bestMatch = -1, thisMatch = -1;\r
269             int selectMe = 0;\r
270             \r
271             for (int i = 0; i < locales.length; i++) {\r
272                 if (i > 0 && locales[i].getLanguage().equals(locales[i-1].getLanguage()) ||\r
273                     i < locales.length - 1 &&\r
274                         locales[i].getLanguage().equals(locales[i+1].getLanguage()))\r
275                 {\r
276                     localeMenu.addItem( locales[i].getDisplayName() );\r
277                 } else {\r
278                     localeMenu.addItem( locales[i].getDisplayLanguage());\r
279                 }\r
280                 \r
281                 thisMatch = DemoUtility.compareLocales(locales[i], defaultLocale);\r
282                 \r
283                 if (thisMatch >= bestMatch) {\r
284                     bestMatch = thisMatch;\r
285                     selectMe = i;\r
286                 }\r
287             }\r
288             \r
289             localeMenu.setBackground(DemoUtility.choiceColor);\r
290             localeMenu.select(selectMe);\r
291 \r
292             Label localeLabel =new Label("Display Locale");\r
293             localeLabel.setFont(DemoUtility.labelFont);\r
294 \r
295             localePanel.add(localeLabel);\r
296             localePanel.add(localeMenu);\r
297             DemoUtility.fixGrid(localePanel,2);\r
298 \r
299             localeMenu.addItemListener( new ItemListener() {\r
300                 public void itemStateChanged(ItemEvent e) {\r
301                     Locale loc = locales[localeMenu.getSelectedIndex()];\r
302                     System.out.println("Change locale to " + loc.getDisplayName());\r
303 \r
304                     for (int i = 0; i < calendars.length; i++) {\r
305                         calendars[i].setLocale(loc);\r
306                     }\r
307                     millisFormat();\r
308                 }\r
309             } );\r
310         }\r
311         add(rollAddPanel);\r
312         add(DemoUtility.createSpacer());\r
313         add(localePanel);\r
314         add(DemoUtility.createSpacer());\r
315 \r
316 // COPYRIGHT\r
317         Panel copyrightPanel = new Panel();\r
318         addWithFont (copyrightPanel,new Label(DemoUtility.copyright1, Label.LEFT),\r
319             DemoUtility.creditFont);\r
320         DemoUtility.fixGrid(copyrightPanel,1);\r
321         add(copyrightPanel);\r
322     }\r
323 \r
324     /**\r
325      * This function is called when users change the pattern text.\r
326      */\r
327     public void setFormatFromPattern() {\r
328         String timePattern = patternText.getText();\r
329 \r
330         for (int i = 0; i < calendars.length; i++) {\r
331             calendars[i].applyPattern(timePattern);\r
332         }\r
333 \r
334         millisFormat();\r
335     }\r
336 \r
337     /**\r
338      * This function is called when it is necessary to parse the time\r
339      * string in one of the formatted date fields\r
340      */\r
341     public void textChanged(int index) {\r
342         String rightString = calendars[index].text.getText();\r
343 \r
344         ParsePosition status = new ParsePosition(0);\r
345 \r
346         if (rightString.length() == 0)\r
347         {\r
348             errorText("Error: no input to parse!");\r
349             return;\r
350         }\r
351 \r
352         try {\r
353             Date date = calendars[index].format.parse(rightString, status);\r
354             time = date.getTime();\r
355         }\r
356         catch (Exception e) {\r
357             for (int i = 0; i < calendars.length; i++) {\r
358                 if (i != index) {\r
359                     calendars[i].text.setText("ERROR");\r
360                 }\r
361             }\r
362             errorText("Exception: " + e.getClass().toString() + " parsing: "+rightString);\r
363             return;\r
364         }\r
365 \r
366         int start = calendars[index].text.getSelectionStart();\r
367         int end = calendars[index].text.getSelectionEnd();\r
368 \r
369         millisFormat();\r
370 \r
371         calendars[index].text.select(start,end);\r
372     }\r
373 \r
374     /**\r
375      * This function is called when it is necessary to format the time\r
376      * in the "Millis" text field.\r
377      */\r
378     public void millisFormat() {\r
379         String out = "";\r
380 \r
381         for (int i = 0; i < calendars.length; i++) {\r
382             try {\r
383                 out = calendars[i].format.format(new Date(time));\r
384                 calendars[i].text.setText(out);\r
385             }\r
386             catch (Exception e) {\r
387                 calendars[i].text.setText("ERROR");\r
388                 errorText("Exception: " + e.getClass().toString() + " formatting "\r
389                             + calendars[i].name + " " + time);\r
390             }\r
391         }\r
392     }\r
393 \r
394 \r
395     /**\r
396      * This function is called when users change the pattern text.\r
397      */\r
398     public void patternTextChanged() {\r
399         setFormatFromPattern();\r
400     }\r
401 \r
402     /**\r
403      * This function is called when users select a new representative city.\r
404      */\r
405     public void cityChanged() {\r
406         TimeZone timeZone = TimeZone.getDefault();\r
407 \r
408         for (int i = 0; i < calendars.length; i++) {\r
409             calendars[i].format.setTimeZone(timeZone);\r
410         }\r
411         millisFormat();\r
412     }\r
413 \r
414     /**\r
415      * This function is called when users select a new time field\r
416      * to add or roll its value.\r
417      */\r
418     public void dateFieldChanged(boolean isUp) {\r
419         int field = kRollAddFields[dateMenu.getSelectedIndex()].field;\r
420 \r
421         for (int i = 0; i < calendars.length; i++)\r
422         {\r
423             if (calendars[i].rollAdd.getState())\r
424             {\r
425                 Calendar c = calendars[i].calendar;\r
426                 c.setTime(new Date(time));\r
427 \r
428                 if (getAdd.getState()) {\r
429                     c.add(field, isUp ? 1 : -1);\r
430                 } else {\r
431                     c.roll(field, isUp);\r
432                 }\r
433 \r
434                 time = c.getTime().getTime();\r
435                 millisFormat();\r
436                 break;\r
437             }\r
438         }\r
439     }\r
440 \r
441     /**\r
442      * Print out the error message while debugging this program.\r
443      */\r
444     public void errorText(String s)\r
445     {\r
446         if (true) {\r
447             System.out.println(s);\r
448         }\r
449     }\r
450     \r
451     /**\r
452      * Called if an action occurs in the CalendarCalcFrame object.\r
453      */\r
454     public void actionPerformed(ActionEvent evt)\r
455     {\r
456         // *** Button events are handled here.\r
457         Object obj = evt.getSource();\r
458         System.out.println("action " + obj);\r
459         if (obj instanceof Button) {\r
460             if (evt.getSource() == up) {\r
461                 dateFieldChanged(false);\r
462             } else\r
463                 if (evt.getSource() == down) {\r
464                     dateFieldChanged(true);\r
465             }\r
466         }\r
467     }\r
468     \r
469     /**\r
470      * Handles the event. Returns true if the event is handled and should not\r
471      * be passed to the parent of this component. The default event handler\r
472      * calls some helper methods to make life easier on the programmer.\r
473      */\r
474     protected void processKeyEvent(KeyEvent evt)\r
475     {\r
476         System.out.println("key " + evt);\r
477         if (evt.getID() == KeyEvent.KEY_RELEASED) { \r
478             if (evt.getSource() == patternText) {\r
479                 patternTextChanged();\r
480             }\r
481             else {\r
482                 for (int i = 0; i < calendars.length; i++) {\r
483                     if (evt.getSource() == calendars[i].text) {\r
484                         textChanged(i);\r
485                     }\r
486                 }\r
487             }\r
488         }\r
489     }\r
490     \r
491     protected void processWindowEvent(WindowEvent evt) \r
492     {\r
493         System.out.println("window " + evt);\r
494         if (evt.getID() == WindowEvent.WINDOW_CLOSING && \r
495             evt.getSource() == this) {\r
496             this.hide();\r
497             this.dispose();\r
498 \r
499             if (applet != null) {\r
500                applet.demoClosed();\r
501             } else System.exit(0);\r
502         }\r
503     }\r
504     \r
505     /*\r
506     protected void processEvent(AWTEvent evt)\r
507     {\r
508         if (evt.getID() == AWTEvent. Event.ACTION_EVENT && evt.target == up) {\r
509             dateFieldChanged(true);\r
510             return true;\r
511         }\r
512         else if (evt.id == Event.ACTION_EVENT && evt.target == down) {\r
513             dateFieldChanged(false);\r
514             return true;\r
515         }\r
516     }\r
517     */\r
518 \r
519     private static final int        FIELD_COLUMNS = 35;\r
520 \r
521 \r
522     class CalendarRec {\r
523         public CalendarRec(String nameStr, Calendar cal)\r
524         {\r
525             name = nameStr;\r
526             calendar = cal;\r
527             rollAdd = new Checkbox();\r
528 \r
529             text = new JTextField("",FIELD_COLUMNS);\r
530             text.setFont(DemoUtility.editFont);\r
531 \r
532             format = DateFormat.getDateInstance(cal, DateFormat.FULL,\r
533                                                 Locale.getDefault());\r
534             //format.applyPattern(DEFAULT_FORMAT);\r
535         }\r
536 \r
537         public void setLocale(Locale loc) {\r
538             String pattern = toPattern();\r
539 \r
540             format = DateFormat.getDateInstance(calendar, DateFormat.FULL,\r
541                                                 loc);\r
542             applyPattern(pattern);\r
543         }\r
544 \r
545         public void applyPattern(String pattern) {\r
546             if (format instanceof SimpleDateFormat) {\r
547                 ((SimpleDateFormat)format).applyPattern(pattern);\r
548 //hey {al} - \r
549 //            } else if (format instanceof java.text.SimpleDateFormat) {\r
550 //                ((java.text.SimpleDateFormat)format).applyPattern(pattern);\r
551             }\r
552         }\r
553         \r
554         private String toPattern() {\r
555             if (format instanceof SimpleDateFormat) {\r
556                 return ((SimpleDateFormat)format).toPattern();\r
557 //hey {al} - \r
558 //            } else if (format instanceof java.text.SimpleDateFormat) {\r
559 //                return ((java.text.SimpleDateFormat)format).toPattern();\r
560             }\r
561             return "";\r
562         }\r
563 \r
564         Calendar  calendar;\r
565         DateFormat          format;\r
566         String              name;\r
567         JTextField           text;\r
568         Checkbox            rollAdd;\r
569     }\r
570 \r
571     private final CalendarRec[] calendars = {\r
572         new CalendarRec("Gregorian",        new GregorianCalendar()),\r
573         new CalendarRec("Hebrew",           new HebrewCalendar()),\r
574         new CalendarRec("Islamic (civil)",  makeIslamic(true)),\r
575         new CalendarRec("Islamic (true)",   makeIslamic(false)),\r
576         new CalendarRec("Buddhist",         new BuddhistCalendar()),\r
577         new CalendarRec("Japanese",         new JapaneseCalendar()),\r
578 //        new CalendarRec("Chinese",          new ChineseCalendar()),\r
579     };\r
580 \r
581     static private final Calendar makeIslamic(boolean civil) {\r
582         IslamicCalendar cal = new IslamicCalendar();\r
583         cal.setCivil(civil);\r
584         return cal;\r
585     }\r
586 }\r
587 \r
588 class RollAddField {\r
589     RollAddField(int field, String name) {\r
590         this.field = field;\r
591         this.name = name;\r
592     }\r
593     int field;\r
594     String name;\r
595 }\r