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