home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgLangD.iso
/
VCAFE.3.0A
/
Sample.bin
/
MessageFormatDemo.java
< prev
next >
Wrap
Text File
|
1998-09-15
|
30KB
|
953 lines
/*
* @(#)MessageFormatDemo.java 1.1 98/06/16
*
* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved
* (C) Copyright IBM Corp. 1996 - All Rights Reserved
*
* Portions copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved.
*
* The original version of this source code and documentation is copyrighted
* and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
* materials are provided under terms of a License Agreement between Taligent
* and Sun. This technology is protected by multiple US and International
* patents. This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
*/
import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.lang.*;
import java.text.*;
/**
* <P> Pattern formats are used to put together sequences of strings, numbers,
* dates, and other formats to create messages. The pattern formatters
* facilitate localization because they prevent both hard-coding of message
* strings, <I> and </I> hard-coding of the concatenation sequence for portions
* of message strings. This means localizers can change the content, format,
* and order of any text as appropriate for any language.
* </P>
* <P><CENTER>
* <A HREF="#format">About the Pattern Format</A>
* <A HREF="#arguments">Formatting Arguments</A><BR>
* <A HREF="#choices">Supporting Multiple Choices</A>
* </CENTER></P>
* <HR>
* <H3><A NAME="format">About the Pattern Format </A></H3>
* <P> The pattern is a sequence of text and arguments, all of which can be
* edited. The positions of the arguments within the sequence are indicated
* by a "%" followed by a digit <I> n </I> identifying the
* argument. The pattern in the demo applet has three arguments, numbered 0,
* 1, and 2. The arguments can appear in any order within the sequence, which
* can be edited and modified.
* </P>
* <TABLE WIDTH=100% CELLPADDING=5>
* <TR>
* <TH ALIGN=left VALIGN=bottom>To See This...</TH>
* <TH ALIGN=left VALIGN=bottom>Do This...</TH>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can move arguments freely within the sequence
* or delete arguments. You can also edit or translate any of the unformatted
* text.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Move the string "on %2" from the end of the pattern to
* the front and correct the capitalization
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* <TD WIDTH=50% VALIGN=top> Translations are provided in the demo applet for
* the G7 countries.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Pull down the Locale menu
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 2.
* </TD>
* <TD> Try several different locales with the up and down arrow keys (on
* Windows) or the mouse button (on Macintosh)
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* </TABLE>
* <P><STRONG><I>Note:</I></STRONG> To add a real percentage character to the
* pattern, enter "%%".
* </P>
* <HR WIDTH=50% ALIGN=left>
* <H3><A NAME="arguments"> Formatting Arguments </A></H3>
* <P> The arguments can be either simple text strings or formattable,
* localizable objects. The pattern in the demo applet, for example, includes
* a date, an unformatted string, and a more complex format called a <I> choice
* </I> format (described below). You can edit these arguments at will. When
* localizing, you can also select any format to be associated with an
* argument.
* </P>
* <TABLE WIDTH=100% CELLPADDING=5>
* <TR>
* <TH ALIGN=left VALIGN=bottom>To See This... </TH>
* <TH ALIGN=left VALIGN=bottom>Do This...</TH>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can modify the value of any argument.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Select the "3" in argument 2 and change it to another number
* the formatted date adjusts to the new value
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can change the format of any argument, and can
* specify "unformatted" arguments that are not localized.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Change the format type for argument 2 to <I> None </I>
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 2.
* </TD>
* <TD> Try different locales and notice that the date does not reformat for
* different locales
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 3.
* </TD>
* <TD> Return the format back to <I>Date </I> and try different locales again.
* The date reformats.
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* </TABLE>
* <HR WIDTH=50% ALIGN=left>
* <H3> <A NAME="choices">Supporting Multiple Choices </A></H3>
* <P> Choice formats, like that used for argument 0, let localizers create
* more natural messages, avoiding phrases like "3 file(s)". As
* shown here, the correct text can be chosen for different numbers. This
* works even in more complicated contexts, such as Slavic languages which
* have more than one plural format based on the number involved. A particular
* choice is chosen based on the value of the argument, and each choice can be
* edited individually.
* </P>
* <P> Look also at the format for the choice associated with values of 2 and
* higher, "%0|3". The vertical bar indicates that the choice
* uses the value for argument 0, but the format for argument 3 (in this case,
* a Number). This allows for a degree of flexibility in using different
* formats.
* </P>
* <TABLE WIDTH=100% CELLPADDING=5>
* <TR>
* <TH ALIGN=left VALIGN=bottom>To See This...</TH>
* <TH ALIGN=left VALIGN=bottom>Do This... </TH>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can edit the value of any of the choice
* options.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Select the Choice String "no files" and type in "not a
* single file"
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 2.
* </TD>
* <TD> Select the value for argument 0 and type in "0"
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can establish different choices for parameters
* based on the value of an argument, so that strings are substituted that
* agree numerically.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Select the value for argument 0 and type in "0", then replace
* it with a "1", and then with a "2". The string changes
* correspondingly.
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 2.
* </TD>
* <TD> Select argument 0 and return the value to "0". Choose the
* French or German locale and notice that it makes correct substitutions in
* any language.
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* <TR>
* <TD WIDTH=50% VALIGN=top> You can add as many alternatives as you need for
* different value ranges.
* </TD>
* <TD VALIGN=top>
* <TABLE CELLSPACING=0 CELLPADDING=0>
* <TR>
* <TD WIDTH=10 VALIGN=top> 1.
* </TD>
* <TD> Select the U.S. English locale
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 2.
* </TD>
* <TD> Select the empty choice value box (under the "2") and type
* in "10"
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 3.
* </TD>
* <TD> Type in "many files" in the corresponding <I> Choice Strings
* </I> field
* </TD>
* </TR>
* <TR>
* <TD WIDTH=10 VALIGN=top> 4.
* </TD>
* <TD> Enter a number larger than10 for the value of argument 0"
* many files" is substituted in the resulting message
* </TD>
* </TR>
* </TABLE>
* </TD>
* </TR>
* </TABLE>
* <P> You can type in other text in the pattern, arguments, or choices fields
* to see different formatting behaviors. Try it out!
* </P>
* @see java.util.Format
* @see java.util.MessageFormat
* @version 1.1 11/23/96
* @author Laura Werner, Mark Davis
*/
public class MessageFormatDemo extends DemoApplet
{
/**
* The main function which defines the behavior of the MessageFormatDemo
* applet when an applet is started.
*/
public static void main(String argv[]) {
DemoApplet.showDemo(new MessageFormatFrame(null));
}
/**
* This creates a MessageFormatFrame for the demo applet.
*/
public Frame createDemoFrame(DemoApplet applet) {
return new MessageFormatFrame(applet);
}
}
/**
* A Frame is a top-level window with a title. The default layout for a frame
* is BorderLayout. The MessageFormatFrame class defines the window layout of
* MessageFormatDemo.
*/
class MessageFormatFrame extends Frame implements WindowListener, ItemListener, KeyListener {
/**
* Constructs a new MessageFormatFrame that is initially invisible.
*/
public MessageFormatFrame(DemoApplet applet)
{
super("Message Formatting Demo");
this.applet = applet;
addWindowListener(this);
init();
start();
}
/**
* Initializes the applet. You never need to call this directly, it
* is called automatically by the system once the applet is created.
*/
public void init() {
//Get all locales for debugging, but only get G7 locales for demos.
if (DEBUG == true)
locales = NumberFormat.getAvailableLocales();
else locales = Utility.getG7Locales();
buildGUI();
}
/**
* Called to start the applet. You never need to call this method
* directly, it is called when the applet's document is visited.
*/
public void start() {
// Stick some initial data into the controls....
arg1Text.setText("3");
arg1Type.select(CHOICE);
arg2Text.setText("MyDisk");
arg2Type.select(NONE);
arg3Text.setText("3 Mar 96");
arg3Type.select(DATE);
arg4Text.setText("");
arg4Type.select(NUMBER);
patternText.setText("The disk '%1' contained %0 on %2.");
// Set up the choice format controls too
choice1Num.setText("0");
choice2Num.setText("1");
choice3Num.setText("2");
resetFormat();
doFormatting();
}
/**
* Reset to the default message format using the ResourceBundle mechanism.
* @see java.util.ResourceBundle
* @see java.util.ListResourceBundle
*/
public void resetFormat() {
Locale locale = locales[localeMenu.getSelectedIndex()];
ClassLoader classLoader = this.getClass().getClassLoader();
choice4Num.setText("");
choice4Text.setText("");
ResourceBundle choiceResources =
ResourceBundle.getBundle("ChoiceResource", locale);
patternText.setText(choiceResources.getString("patternText"));
choice1Text.setText(choiceResources.getString("choice1"));
choice2Text.setText(choiceResources.getString("choice2"));
choice3Text.setText(choiceResources.getString("choice3"));
}
/**
* Create a new format based on the selected type. For example, a new
* format needs to be created if a different locale or format type is
* selected.
*/
public Format createFormat(Choice typeMenu)
{
int type = typeMenu.getSelectedIndex();
Locale locale = locales[localeMenu.getSelectedIndex()];
Format result = null;
if (type == NUMBER) {
result = NumberFormat.getInstance(locale);
}
else if (type == DATE) {
result = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
}
else if (type == CHOICE) {
result = choiceFormat; // XXX
}
return result;
}
/**
* Create a new format based on the selection changes and update the
* output text area.
*/
public void doFormatting() {
// Create a ChoiceFormat based on the settings in the choice field
double[] limits = new double[4];
limits[0] = doubleValue(choice1Num.getText());
limits[1] = doubleValue(choice2Num.getText());
limits[2] = doubleValue(choice3Num.getText());
limits[3] = doubleValue(choice4Num.getText());
String[] choices = new String[4];
choices[0] = choice1Text.getText();
choices[1] = choice2Text.getText();
choices[2] = choice3Text.getText();
choices[3] = choice4Text.getText();
choiceFormat = new ChoiceFormat(limits, choices); // XXX
// Create the individual formatters for the items in the pattern....
Format[] formats = new Format[4];
formats[0] = createFormat(arg1Type);
formats[1] = createFormat(arg2Type);
formats[2] = createFormat(arg3Type);
formats[3] = createFormat(arg4Type);
// Now create the Message Formatter itself
MessageFormat format = new MessageFormat(patternText.getText());
// Create the array of objects to format....
Object[] objects = new Object[4];
objects[0] = createObject(arg1Type, arg1Text);
objects[1] = createObject(arg2Type, arg2Text);
objects[2] = createObject(arg3Type, arg3Text);
objects[3] = createObject(arg4Type, arg4Text);
String result = null;
try {
result = format.format(objects);
}
catch (Exception e)
{
errorText("format threw an exception: " + e.toString());
result = "ERROR";
}
resultText.setText(result);
}
/* ItemListener method */
public void itemStateChanged(ItemEvent e) {
if((e.getSource() == arg1Type) || (e.getSource() == arg2Type) || (e.getSource() == arg3Type)
|| (e.getSource() == arg4Type)) {
doFormatting();
} else if (e.getSource() == localeMenu) {
resetFormat();
doFormatting();
}
}
/* KeyListener methods */
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if ((e.getSource() == choice1Text) || (e.getSource() == choice2Text) ||
(e.getSource() == choice3Text) || (e.getSource() == choice4Text)) {
e.consume();
doFormatting();
} else if ((e.getSource() == choice1Num) ||(e.getSource() == choice2Num) ||
(e.getSource() == choice3Num) ||(e.getSource() == choice4Num)) {
e.consume();
doFormatting();
} else if ((e.getSource() == arg1Text) ||(e.getSource() == arg2Text) ||
(e.getSource() == arg3Text) ||(e.getSource() == arg4Text)) {
e.consume();
doFormatting();
} else if (e.getSource() == patternText) {
e.consume();
doFormatting();
}
}
public void keyTyped(KeyEvent e) {
}
/* Window Listener methods */
public void windowClosed(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
setVisible(false);
dispose();
if (applet != null) {
applet.demoClosed();
} else System.exit(0);
}
//------------------------------------------------------------
// package private
//------------------------------------------------------------
double doubleValue(String s) {
try {
return Double.valueOf(s).doubleValue();
} catch (Exception foo) {
return Double.POSITIVE_INFINITY;
}
}
void constrainedAdd(GridBagConstraints c,
Container container,
Component foo,
Font font) {
GridBagLayout gridbag = (GridBagLayout)container.getLayout();
if (font != null)
foo.setFont(font);
gridbag.setConstraints(foo, c);
container.add(foo);
}
Choice cloneChoice (Choice source) {
Choice result = new Choice();
for (int i = 0; i < source.getItemCount(); ++i)
result.addItem(source.getItem(i));
result.setFont(source.getFont());
return result;
}
void addWithFont(Container container, Component foo, Font font) {
if (font != null)
foo.setFont(font);
container.add(foo);
}
//{{DECLARE_CONTROLS
Label label1;
Label label2;
TextField patternText;
Label label3;
Label label4;
Label label5;
Label labelArg;
Label labelForm;
TextField arg1Text;
TextField arg2Text;
TextField arg3Text;
Choice arg1Type;
Choice arg2Type;
Choice arg3Type;
Label label6;
Choice localeMenu;
Label localeLabel;
Label label13;
Label label14;
TextField resultText;
Label label7;
Label label8;
Label label9;
TextField choice1Num;
TextField choice2Num;
TextField choice3Num;
TextField choice4Num;
TextField choice1Text;
TextField choice2Text;
TextField choice3Text;
TextField choice4Text;
Label label10;
Label label11;
Label label12;
TextField arg4Text;
Choice arg4Type;
//}}
//------------------------------------------------------------
// private
//------------------------------------------------------------
private void buildGUI() {
//{{INIT_CONTROLS
setLayout(new FlowLayout(FlowLayout.CENTER,2,2)); // MD 8/7
setBackground(Color.white); // MD 8/7
// Main Title
Panel titleCreditPanel = new Panel();
label6=new Label("Message Format Demo", Label.CENTER);
label6.setFont(Utility.titleFont);
titleCreditPanel.add(label6);
Panel creditPanel = new Panel();
label13=new Label(creditString);
label13.setFont(Utility.creditFont);
creditPanel.add(label13);
titleCreditPanel.add(creditPanel);
Utility.fixGrid(titleCreditPanel,1);
// result text
Panel patternResultPanel = new Panel();
addWithFont(patternResultPanel,new
Label("Result", Label.RIGHT),Utility.labelFont);
addWithFont(patternResultPanel,resultText= new
TextField(FIELD_COLUMNS),Utility.editFont);
addWithFont(patternResultPanel,new
Label("Pattern", Label.RIGHT),Utility.labelFont);
addWithFont(patternResultPanel,patternText=new
TextField(FIELD_COLUMNS),Utility.editFont);
patternText.addKeyListener(this);
Utility.fixGrid(patternResultPanel,2);
// Locale and credits
Panel localeCreditPanel = new Panel();
// localeCreditPanel.setLayout(new GridBagLayout());
localeLabel=new Label("Locale:",Label.LEFT);
localeLabel.setFont(Utility.labelFont);
//localeCreditPanel.add("loc",localeLabel);
// LOCALE
localeMenu= new Choice();
localeMenu.addItemListener(this);
// Stick the names of the locales into the locale popup menu
Locale displayLocale = Locale.getDefault();
for (int i = 0; i < locales.length; i++) {
if (locales[i].getCountry().length() > 0) {
localeMenu.addItem( locales[i].getDisplayName() );
if (locales[i].equals(Locale.getDefault())) {
localeMenu.select(i);
}
}
}
localeMenu.setFont(Utility.choiceFont);
Panel localePanel=new Panel();
localePanel.add(localeLabel);
localePanel.add(localeMenu);
localeCreditPanel.add(localePanel);
arg1Type= new Choice();
arg1Type.setFont(Utility.choiceFont);
arg1Type.addItem("Number");
arg1Type.addItem("Date");
arg1Type.addItem("Choice");
arg1Type.addItem("None");
arg1Type.addItemListener(this);
// PUT THE ARGUMENTS/ FORMATS into GRID
Panel allArgs = new Panel();
addWithFont(allArgs,new Label(" "),Utility.labelFont);
addWithFont(allArgs,new Label("Arguments", Label.LEFT),
Utility.labelFont);
addWithFont(allArgs,new Label("0",Label.RIGHT),Utility.labelFont);
addWithFont(allArgs,arg1Text=new TextField(12),Utility.editFont);
addWithFont(allArgs,new Label("1",Label.RIGHT),Utility.labelFont);
addWithFont(allArgs,arg2Text=new TextField(12),Utility.editFont);
addWithFont(allArgs,new Label("2",Label.RIGHT),Utility.labelFont);
addWithFont(allArgs,arg3Text=new TextField(12),Utility.editFont);
addWithFont(allArgs,new Label("3",Label.RIGHT),Utility.labelFont);
addWithFont(allArgs,arg4Text=new TextField(12),Utility.editFont);
arg1Text.addKeyListener(this);
arg2Text.addKeyListener(this);
arg3Text.addKeyListener(this);
arg4Text.addKeyListener(this);
Utility.fixGrid(allArgs,2);
Panel formatPanel = new Panel();
addWithFont(formatPanel,new Label(" "),Utility.labelFont);
addWithFont(formatPanel,new Label("Formats", Label.LEFT),
Utility.labelFont);
addWithFont(formatPanel,new Label("0",Label.RIGHT),Utility.labelFont);
addWithFont(formatPanel,arg1Type,Utility.choiceFont);
addWithFont(formatPanel,new Label("1",Label.RIGHT),Utility.labelFont);
addWithFont(formatPanel,arg2Type = cloneChoice(arg1Type),
Utility.choiceFont);
addWithFont(formatPanel,new Label("2",Label.RIGHT),Utility.labelFont);
addWithFont(formatPanel,arg3Type = cloneChoice(arg1Type),
Utility.choiceFont);
addWithFont(formatPanel,new Label("3",Label.RIGHT),Utility.labelFont);
addWithFont(formatPanel,arg4Type = cloneChoice(arg1Type),
Utility.choiceFont);
arg2Type.addItemListener(this);
arg3Type.addItemListener(this);
arg4Type.addItemListener(this);
Utility.fixGrid(formatPanel,2);
// Choices panel
Panel choicesPanel = new Panel();
addWithFont(choicesPanel,new Label(">=", Label.LEFT),
Utility.labelFont);
addWithFont(choicesPanel,new Label("Choice Strings", Label.LEFT),
Utility.labelFont);
addWithFont(choicesPanel,choice1Num=new TextField(4),
Utility.editFont);
addWithFont(choicesPanel,choice1Text=new TextField(16),
Utility.editFont);
addWithFont(choicesPanel,choice2Num=new TextField(4),
Utility.editFont);
addWithFont(choicesPanel,choice2Text=new TextField(16),
Utility.editFont);
addWithFont(choicesPanel,choice3Num=new TextField(4),
Utility.editFont);
addWithFont(choicesPanel,choice3Text=new TextField(16),
Utility.editFont);
addWithFont(choicesPanel,choice4Num=new TextField(4),
Utility.editFont);
addWithFont(choicesPanel,choice4Text=new TextField(16),
Utility.editFont);
choice1Text.addKeyListener(this);
choice2Text.addKeyListener(this);
choice3Text.addKeyListener(this);
choice4Text.addKeyListener(this);
choice1Num.addKeyListener(this);
choice2Num.addKeyListener(this);
choice3Num.addKeyListener(this);
choice4Num.addKeyListener(this);
Utility.fixGrid(choicesPanel,2);
add(titleCreditPanel);
add(patternResultPanel);
add(localeCreditPanel);
Panel bottomPanel = new Panel();
bottomPanel.add(allArgs);
XBorderPanel x = new XBorderPanel(); // MD 8/7
x.setBackground(Color.lightGray);
x.setLayout(null);
x.setSize(8,130);
bottomPanel.add(x);
bottomPanel.add(formatPanel);
XBorderPanel x1 = new XBorderPanel(); // MD 8/7
x1.setBackground(Color.lightGray);
x1.setLayout(null);
x1.setSize(8,130);
bottomPanel.add(x1);
bottomPanel.add(choicesPanel);
Utility.fixGrid(bottomPanel,5);
// MD 8/7 only after fixGrid
Utility.setInsets(bottomPanel,x,new Insets(20,20,2,2));
Utility.setInsets(bottomPanel,x1,new Insets(20,20,2,20));
add(bottomPanel);
Panel copyrightPanel = new Panel();
addWithFont (copyrightPanel,new Label(copyrightString, Label.LEFT),
Utility.creditFont);
addWithFont (copyrightPanel,new Label(copyrightString2, Label.LEFT),
Utility.creditFont);
Utility.fixGrid(copyrightPanel,1);
add(copyrightPanel);
}
private Object createObject(Choice typeMenu, TextField textField )
{
int type = typeMenu.getSelectedIndex();
String text = textField.getText();
Object result = null;
try {
if (type == NUMBER || type == CHOICE)
{
result = new Double(text);
}
else if (type == DATE)
{
// Still use the deprecated new Date(text) until
// the DateFormat.parse(text) is working properly.
result = new Long( (new Date(text)).getTime() + 1);
// 1 millisecond was added to display the date correctly.
// This is done to fix the following scenario, eg,
// "27 Sept 96" ==> "26 Sept 96 12:00 AM PDT" which is
// equvalent to "27 Sept 96 00:00 AM PDT". -- CLH 9/27/96
}
else if (type == NONE)
{
result = text;
}
}
catch (RuntimeException e) {
}
return result;
}
private void errorText(String s)
{
if (DEBUG)
{
System.out.println(s);
}
}
private static final String creditString =
"v1.1a7, Demos";
private static final String copyrightString =
"";
private static final String copyrightString2 =
"";
private static final int FIELD_COLUMNS = 60;
static private final int NUMBER = 0;
static private final int DATE = 1;
static private final int CHOICE = 2;
static private final int NONE = 3;
private static final boolean DEBUG = false;
private Locale[] locales;
private DemoApplet applet;
private ChoiceFormat choiceFormat; // XXX
}
// MD 8/7 whole class, from Ralf. Use different name!
class XBorderPanel extends Panel
{
/**
* Panel shadow border width
*/
protected int shadow = 4;
/**
* Panel raised vs depressed look
*/
protected boolean raised = true;
public XBorderPanel() {
this.raised=true;
}
public XBorderPanel(boolean raised) {
this.raised=raised;
}
/**
* Re-layout parent. Called when a panel changes
* size etc.
*/
protected void layoutParent() {
Container parent = getParent();
if (parent != null) {
parent.doLayout();
}
}
public void paint(Graphics g) {
super.paint(g);
Dimension size = getSize();
paintBorder(g, size);
}
protected void paintBorder(Graphics g, Dimension size) {
Color c = getBackground();
g.setColor(c);
g.fillRect(0, 0, size.width, size.height);
draw3DRect(g, 0, 0, size.width, size.height, raised);
}
/**
* Draw a 3D Rectangle.
* @param g the specified Graphics window
* @param x, y, width, height
* @param raised - true if border should be painted as raised.
* @see #paint
*/
public void draw3DRect(Graphics g, int x, int y, int width, int height,
boolean raised) {
Color c = g.getColor();
Color brighter = avgColor(c,Color.white);
Color darker = avgColor(c,Color.black);
// upper left corner
g.setColor(raised ? brighter : darker);
for (int i=0; i<shadow; i++) {
g.drawLine(x+i, y+i, x+width-1-i, y+i);
g.drawLine(x+i, y+i, x+i, y+height-1-i);
}
// lower right corner
g.setColor(raised ? darker : brighter);
for (int i=0; i<shadow; i++) {
g.drawLine(x+i, y+height-1-i, x+width-1-i, y+height-1-i);
g.drawLine(x+width-1-i, y+height-1-i, x+width-1-i, y+i);
}
g.setColor(c);
// added by rip.
g.setColor(Color.black);
g.drawRect(x,y,width+2,height+2);
}
public static Color avgColor(Color c1, Color c2) {
return new Color(
(c1.getRed()+c2.getRed())/2,
(c1.getGreen()+c2.getGreen())/2,
(c1.getBlue()+c2.getBlue())/2
);
}
}