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