Mega Code Archive

 
Categories / Java / Internationalization
 

This program demonstrates collating strings under various locales

/*  This program is a part of the companion code for Core Java 8th ed.  (http://horstmann.com/corejava)  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation, either version 3 of the License, or  (at your option) any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /**  * This program demonstrates collating strings under various locales.  *   * @version 1.13 2007-07-25  * @author Cay Horstmann  */ public class CollationTest {   public static void main(String[] args) {     EventQueue.invokeLater(new Runnable() {       public void run() {         JFrame frame = new CollationFrame();         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);       }     });   } } /**  * This frame contains combo boxes to pick a locale, collation strength and  * decomposition rules, a text field and button to add new strings, and a text  * area to list the collated strings.  */ class CollationFrame extends JFrame {   public CollationFrame() {     setTitle("CollationTest");     setLayout(new GridBagLayout());     add(new JLabel("Locale"), new GBC(0, 0).setAnchor(GBC.EAST));     add(new JLabel("Strength"), new GBC(0, 1).setAnchor(GBC.EAST));     add(new JLabel("Decomposition"), new GBC(0, 2).setAnchor(GBC.EAST));     add(addButton, new GBC(0, 3).setAnchor(GBC.EAST));     add(localeCombo, new GBC(1, 0).setAnchor(GBC.WEST));     add(strengthCombo, new GBC(1, 1).setAnchor(GBC.WEST));     add(decompositionCombo, new GBC(1, 2).setAnchor(GBC.WEST));     add(newWord, new GBC(1, 3).setFill(GBC.HORIZONTAL));     add(new JScrollPane(sortedWords), new GBC(0, 4, 2, 1).setFill(GBC.BOTH));     locales = (Locale[]) Collator.getAvailableLocales().clone();     Arrays.sort(locales, new Comparator<Locale>() {       private Collator collator = Collator.getInstance(Locale.getDefault());       public int compare(Locale l1, Locale l2) {         return collator.compare(l1.getDisplayName(), l2.getDisplayName());       }     });     for (Locale loc : locales)       localeCombo.addItem(loc.getDisplayName());     localeCombo.setSelectedItem(Locale.getDefault().getDisplayName());     strings.add("America");     strings.add("able");     strings.add("Zulu");     strings.add("zebra");     strings.add("\u00C5ngstr\u00F6m");     strings.add("A\u030angstro\u0308m");     strings.add("Angstrom");     strings.add("Able");     strings.add("office");     strings.add("o\uFB03ce");     strings.add("Java\u2122");     strings.add("JavaTM");     updateDisplay();     addButton.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent event) {         strings.add(newWord.getText());         updateDisplay();       }     });     ActionListener listener = new ActionListener() {       public void actionPerformed(ActionEvent event) {         updateDisplay();       }     };     localeCombo.addActionListener(listener);     strengthCombo.addActionListener(listener);     decompositionCombo.addActionListener(listener);     pack();   }   /**    * Updates the display and collates the strings according to the user    * settings.    */   public void updateDisplay() {     Locale currentLocale = locales[localeCombo.getSelectedIndex()];     localeCombo.setLocale(currentLocale);     currentCollator = Collator.getInstance(currentLocale);     currentCollator.setStrength(strengthCombo.getValue());     currentCollator.setDecomposition(decompositionCombo.getValue());     Collections.sort(strings, currentCollator);     sortedWords.setText("");     for (int i = 0; i < strings.size(); i++) {       String s = strings.get(i);       if (i > 0 && currentCollator.compare(s, strings.get(i - 1)) == 0)         sortedWords.append("= ");       sortedWords.append(s + "\n");     }     pack();   }   private List<String> strings = new ArrayList<String>();   private Collator currentCollator;   private Locale[] locales;   private JComboBox localeCombo = new JComboBox();   private EnumCombo strengthCombo = new EnumCombo(Collator.class, new String[] { "Primary",       "Secondary", "Tertiary", "Identical" });   private EnumCombo decompositionCombo = new EnumCombo(Collator.class, new String[] {       "Canonical Decomposition", "Full Decomposition", "No Decomposition" });   private JTextField newWord = new JTextField(20);   private JTextArea sortedWords = new JTextArea(20, 20);   private JButton addButton = new JButton("Add"); } /*  * This program is a part of the companion code for Core Java 8th ed.  * (http://horstmann.com/corejava)  *   * This program is free software: you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation, either version 3 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program. If not, see <http://www.gnu.org/licenses/>.  */ /*  * GBC - A convenience class to tame the GridBagLayout  *   * Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com)  *   * This program is free software; you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation; either version 2 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple  * Place, Suite 330, Boston, MA 02111-1307 USA  */ /**  * This class simplifies the use of the GridBagConstraints class.  */ class GBC extends GridBagConstraints {   /**    * Constructs a GBC with a given gridx and gridy position and all other grid    * bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    */   public GBC(int gridx, int gridy) {     this.gridx = gridx;     this.gridy = gridy;   }   /**    * Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all    * other grid bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    * @param gridwidth    *          the cell span in x-direction    * @param gridheight    *          the cell span in y-direction    */   public GBC(int gridx, int gridy, int gridwidth, int gridheight) {     this.gridx = gridx;     this.gridy = gridy;     this.gridwidth = gridwidth;     this.gridheight = gridheight;   }   /**    * Sets the anchor.    *     * @param anchor    *          the anchor value    * @return this object for further modification    */   public GBC setAnchor(int anchor) {     this.anchor = anchor;     return this;   }   /**    * Sets the fill direction.    *     * @param fill    *          the fill direction    * @return this object for further modification    */   public GBC setFill(int fill) {     this.fill = fill;     return this;   }   /**    * Sets the cell weights.    *     * @param weightx    *          the cell weight in x-direction    * @param weighty    *          the cell weight in y-direction    * @return this object for further modification    */   public GBC setWeight(double weightx, double weighty) {     this.weightx = weightx;     this.weighty = weighty;     return this;   }   /**    * Sets the insets of this cell.    *     * @param distance    *          the spacing to use in all directions    * @return this object for further modification    */   public GBC setInsets(int distance) {     this.insets = new Insets(distance, distance, distance, distance);     return this;   }   /**    * Sets the insets of this cell.    *     * @param top    *          the spacing to use on top    * @param left    *          the spacing to use to the left    * @param bottom    *          the spacing to use on the bottom    * @param right    *          the spacing to use to the right    * @return this object for further modification    */   public GBC setInsets(int top, int left, int bottom, int right) {     this.insets = new Insets(top, left, bottom, right);     return this;   }   /**    * Sets the internal padding    *     * @param ipadx    *          the internal padding in x-direction    * @param ipady    *          the internal padding in y-direction    * @return this object for further modification    */   public GBC setIpad(int ipadx, int ipady) {     this.ipadx = ipadx;     this.ipady = ipady;     return this;   } } /*  * This program is a part of the companion code for Core Java 8th ed.  * (http://horstmann.com/corejava)  *   * This program is free software: you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation, either version 3 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program. If not, see <http://www.gnu.org/licenses/>.  */ /**  * A combo box that lets users choose from among static field values whose names  * are given in the constructor.  *   * @version 1.13 2007-07-25  * @author Cay Horstmann  */ class EnumCombo extends JComboBox {   /**    * Constructs an EnumCombo.    *     * @param cl    *          a class    * @param labels    *          an array of static field names of cl    */   public EnumCombo(Class<?> cl, String[] labels) {     for (String label : labels) {       String name = label.toUpperCase().replace(' ', '_');       int value = 0;       try {         java.lang.reflect.Field f = cl.getField(name);         value = f.getInt(cl);       } catch (Exception e) {         label = "(" + label + ")";       }       table.put(label, value);       addItem(label);     }     setSelectedItem(labels[0]);   }   /**    * Returns the value of the field that the user selected.    *     * @return the static field value    */   public int getValue() {     return table.get(getSelectedItem());   }   private Map<String, Integer> table = new TreeMap<String, Integer>(); }