--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/jfc/Font2DTest/RangeMenu.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,443 @@
+/*
+ * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Sun Microsystems nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.*;
+
+/**
+ * RangeMenu.java
+ *
+ * @author Shinsuke Fukuda
+ * @author Ankit Patel [Conversion to Swing - 01/07/30]
+ */
+
+/// Custom made choice menu that holds data for unicode range
+
+public final class RangeMenu extends JComboBox implements ActionListener {
+
+ /// Painfully extracted from java.lang.Character.UnicodeBlock. Arrrgh!
+ /// Unicode 3.0 data.
+
+ private final int[][] UNICODE_RANGES = {
+ { 0x000000, 0x00007f }, /// BASIC_LATIN
+ { 0x000080, 0x0000ff }, /// LATIN_1_SUPPLEMENT
+ { 0x000100, 0x00017f }, /// LATIN_EXTENDED_A
+ { 0x000180, 0x00024f }, /// LATIN_EXTENDED_B
+ { 0x000250, 0x0002af }, /// IPA_EXTENSIONS
+ { 0x0002b0, 0x0002ff }, /// SPACING_MODIFIER_LETTERS
+ { 0x000300, 0x00036f }, /// COMBINING_DIACRITICAL_MARKS
+ { 0x000370, 0x0003ff }, /// GREEK
+ { 0x000400, 0x0004ff }, /// CYRILLIC
+ { 0x000500, 0x00052f }, /// CYRILLIC_SUPPLEMENTARY
+ { 0x000530, 0x00058f }, /// ARMENIAN
+ { 0x000590, 0x0005ff }, /// HEBREW
+ { 0x000600, 0x0006ff }, /// ARABIC
+ { 0x000700, 0x00074f }, /// SYRIAC
+ { 0x000780, 0x0007bf }, /// THAANA
+ { 0x000900, 0x00097f }, /// DEVANAGARI
+ { 0x000980, 0x0009ff }, /// BENGALI
+ { 0x000a00, 0x000a7f }, /// GURMUKHI
+ { 0x000a80, 0x000aff }, /// GUJARATI
+ { 0x000b00, 0x000b7f }, /// ORIYA
+ { 0x000b80, 0x000bff }, /// TAMIL
+ { 0x000c00, 0x000c7f }, /// TELUGU
+ { 0x000c80, 0x000cff }, /// KANNADA
+ { 0x000d00, 0x000d7f }, /// MALAYALAM
+ { 0x000d80, 0x000dff }, /// SINHALA
+ { 0x000e00, 0x000e7f }, /// THAI
+ { 0x000e80, 0x000eff }, /// LAO
+ { 0x000f00, 0x000fff }, /// TIBETAN
+ { 0x001000, 0x00109f }, /// MYANMAR
+ { 0x0010a0, 0x0010ff }, /// GEORGIAN
+ { 0x001100, 0x0011ff }, /// HANGUL_JAMO
+ { 0x001200, 0x00137f }, /// ETHIOPIC
+ { 0x0013a0, 0x0013ff }, /// CHEROKEE
+ { 0x001400, 0x00167f }, /// UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS
+ { 0x001680, 0x00169f }, /// OGHAM
+ { 0x0016a0, 0x0016ff }, /// RUNIC
+ { 0x001700, 0x00171f }, /// TAGALOG
+ { 0x001720, 0x00173f }, /// HANUNOO
+ { 0x001740, 0x00175f }, /// BUHID
+ { 0x001760, 0x00177f }, /// TAGBANWA
+ { 0x001780, 0x0017ff }, /// KHMER
+ { 0x001800, 0x0018af }, /// MONGOLIAN
+ { 0x001900, 0x00194f }, /// LIMBU
+ { 0x001950, 0x00197f }, /// TAI_LE
+ { 0x0019e0, 0x0019ff }, /// KHMER_SYMBOLS
+ { 0x001d00, 0x001d7f }, /// PHONETIC_EXTENSIONS
+ { 0x001e00, 0x001eff }, /// LATIN_EXTENDED_ADDITIONAL
+ { 0x001f00, 0x001fff }, /// GREEK_EXTENDED
+ { 0x002000, 0x00206f }, /// GENERAL_PUNCTUATION
+ { 0x002070, 0x00209f }, /// SUPERSCRIPTS_AND_SUBSCRIPTS
+ { 0x0020a0, 0x0020cf }, /// CURRENCY_SYMBOLS
+ { 0x0020d0, 0x0020ff }, /// COMBINING_MARKS_FOR_SYMBOLS
+ { 0x002100, 0x00214f }, /// LETTERLIKE_SYMBOLS
+ { 0x002150, 0x00218f }, /// NUMBER_FORMS
+ { 0x002190, 0x0021ff }, /// ARROWS
+ { 0x002200, 0x0022ff }, /// MATHEMATICAL_OPERATORS
+ { 0x002300, 0x0023ff }, /// MISCELLANEOUS_TECHNICAL
+ { 0x002400, 0x00243f }, /// CONTROL_PICTURES
+ { 0x002440, 0x00245f }, /// OPTICAL_CHARACTER_RECOGNITION
+ { 0x002460, 0x0024ff }, /// ENCLOSED_ALPHANUMERICS
+ { 0x002500, 0x00257f }, /// BOX_DRAWING
+ { 0x002580, 0x00259f }, /// BLOCK_ELEMENTS
+ { 0x0025a0, 0x0025ff }, /// GEOMETRIC_SHAPES
+ { 0x002600, 0x0026ff }, /// MISCELLANEOUS_SYMBOLS
+ { 0x002700, 0x0027bf }, /// DINGBATS
+ { 0x0027c0, 0x0027ef }, /// MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A
+ { 0x0027f0, 0x0027ff }, /// SUPPLEMENTAL_ARROWS_A
+ { 0x002800, 0x0028ff }, /// BRAILLE_PATTERNS
+ { 0x002900, 0x00297f }, /// SUPPLEMENTAL_ARROWS_B
+ { 0x002980, 0x0029ff }, /// MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B
+ { 0x002a00, 0x002aff }, /// SUPPLEMENTAL_MATHEMATICAL_OPERATORS
+ { 0x002b00, 0x002bff }, /// MISCELLANEOUS_SYMBOLS_AND_ARROWS
+ { 0x002e80, 0x002eff }, /// CJK_RADICALS_SUPPLEMENT
+ { 0x002f00, 0x002fdf }, /// KANGXI_RADICALS
+ { 0x002ff0, 0x002fff }, /// IDEOGRAPHIC_DESCRIPTION_CHARACTERS
+ { 0x003000, 0x00303f }, /// CJK_SYMBOLS_AND_PUNCTUATION
+ { 0x003040, 0x00309f }, /// HIRAGANA
+ { 0x0030a0, 0x0030ff }, /// KATAKANA
+ { 0x003100, 0x00312f }, /// BOPOMOFO
+ { 0x003130, 0x00318f }, /// HANGUL_COMPATIBILITY_JAMO
+ { 0x003190, 0x00319f }, /// KANBUN
+ { 0x0031a0, 0x0031bf }, /// BOPOMOFO_EXTENDED
+ { 0x0031f0, 0x0031ff }, /// KATAKANA_PHONETIC_EXTENSIONS
+ { 0x003200, 0x0032ff }, /// ENCLOSED_CJK_LETTERS_AND_MONTHS
+ { 0x003300, 0x0033ff }, /// CJK_COMPATIBILITY
+ { 0x003400, 0x004dbf }, /// CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
+ { 0x004dc0, 0x004dff }, /// YIJING_HEXAGRAM_SYMBOLS
+ { 0x004e00, 0x009fff }, /// CJK_UNIFIED_IDEOGRAPHS
+ { 0x00a000, 0x00a48f }, /// YI_SYLLABLES
+ { 0x00a490, 0x00a4cf }, /// YI_RADICALS
+ { 0x00ac00, 0x00d7af }, /// HANGUL_SYLLABLES
+ { 0x00d800, 0x00dfff }, /// SURROGATES_AREA
+ { 0x00e000, 0x00f8ff }, /// PRIVATE_USE_AREA
+ { 0x00f900, 0x00faff }, /// CJK_COMPATIBILITY_IDEOGRAPHS
+ { 0x00fb00, 0x00fb4f }, /// ALPHABETIC_PRESENTATION_FORMS
+ { 0x00fb50, 0x00fdff }, /// ARABIC_PRESENTATION_FORMS_A
+ { 0x00fe00, 0x00fe0f }, /// VARIATION_SELECTORS
+ { 0x00fe20, 0x00fe2f }, /// COMBINING_HALF_MARKS
+ { 0x00fe30, 0x00fe4f }, /// CJK_COMPATIBILITY_FORMS
+ { 0x00fe50, 0x00fe6f }, /// SMALL_FORM_VARIANTS
+ { 0x00fe70, 0x00feff }, /// ARABIC_PRESENTATION_FORMS_B
+ { 0x00ff00, 0x00ffef }, /// HALFWIDTH_AND_FULLWIDTH_FORMS
+ { 0x00fff0, 0x00ffff }, /// SPECIALS
+ { 0x010000, 0x01007f }, /// LINEAR_B_SYLLABARY
+ { 0x010080, 0x0100ff }, /// LINEAR_B_IDEOGRAMS
+ { 0x010100, 0x01013f }, /// AEGEAN_NUMBERS
+ { 0x010300, 0x01032f }, /// OLD_ITALIC
+ { 0x010330, 0x01034f }, /// GOTHIC
+ { 0x010380, 0x01039f }, /// UGARITIC
+ { 0x010400, 0x01044f }, /// DESERET
+ { 0x010450, 0x01047f }, /// SHAVIAN
+ { 0x010480, 0x0104af }, /// OSMANYA
+ { 0x010800, 0x01083f }, /// CYPRIOT_SYLLABARY
+ { 0x01d000, 0x01d0ff }, /// BYZANTINE_MUSICAL_SYMBOLS
+ { 0x01d100, 0x01d1ff }, /// MUSICAL_SYMBOLS
+ { 0x01d300, 0x01d35f }, /// TAI_XUAN_JING_SYMBOLS
+ { 0x01d400, 0x01d7ff }, /// MATHEMATICAL_ALPHANUMERIC_SYMBOLS
+ { 0x020000, 0x02a6df }, /// CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
+ { 0x02f800, 0x02fa1f }, /// CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT
+ { 0x0e0000, 0x0e007f }, /// TAGS
+ { 0x0e0100, 0x0e01ef }, /// VARIATION_SELECTORS_SUPPLEMENT
+ { 0x0f0000, 0x0fffff }, /// SUPPLEMENTARY_PRIVATE_USE_AREA_A
+ { 0x100000, 0x10ffff }, /// SUPPLEMENTARY_PRIVATE_USE_AREA_B
+ { 0x000000, 0x00007f }, /// OTHER [USER DEFINED RANGE]
+ };
+
+ private final String[] UNICODE_RANGE_NAMES = {
+ "Basic Latin",
+ "Latin-1 Supplement",
+ "Latin Extended-A",
+ "Latin Extended-B",
+ "IPA Extensions",
+ "Spacing Modifier Letters",
+ "Combining Diacritical Marks",
+ "Greek",
+ "Cyrillic",
+ "Cyrillic Supplement",
+ "Armenian",
+ "Hebrew",
+ "Arabic",
+ "Syriac",
+ "Thaana",
+ "Devanagari",
+ "Bengali",
+ "Gurmukhi",
+ "Gujarati",
+ "Oriya",
+ "Tamil",
+ "Telugu",
+ "Kannada",
+ "Malayalam",
+ "Sinhala",
+ "Thai",
+ "Lao",
+ "Tibetan",
+ "Myanmar",
+ "Georgian",
+ "Hangul Jamo",
+ "Ethiopic",
+ "Cherokee",
+ "Unified Canadian Aboriginal Syllabics",
+ "Ogham",
+ "Runic",
+ "Tagalog",
+ "Hanunoo",
+ "Buhid",
+ "Tagbanwa",
+ "Khmer",
+ "Mongolian",
+ "Limbu",
+ "Tai Le",
+ "Khmer Symbols",
+ "Phonetic Extensions",
+ "Latin Extended Additional",
+ "Greek Extended",
+ "General Punctuation",
+ "Superscripts and Subscripts",
+ "Currency Symbols",
+ "Combining Marks for Symbols",
+ "Letterlike Symbols",
+ "Number Forms",
+ "Arrows",
+ "Mathematical Operators",
+ "Miscellaneous Technical",
+ "Control Pictures",
+ "Optical Character Recognition",
+ "Enclosed Alphanumerics",
+ "Box Drawing",
+ "Block Elements",
+ "Geometric Shapes",
+ "Miscellaneous Symbols",
+ "Dingbats",
+ "Miscellaneous Mathematical Symbols-A",
+ "Supplemental Arrows-A",
+ "Braille Patterns",
+ "Supplemental Arrows-B",
+ "Miscellaneous Mathematical Symbols-B",
+ "Supplemental Mathematical Operators",
+ "Miscellaneous Symbols and Arrows",
+ "CJK Radicals Supplement",
+ "Kangxi Radicals",
+ "Ideographic Description Characters",
+ "CJK Symbols and Punctuation",
+ "Hiragana",
+ "Katakana",
+ "Bopomofo",
+ "Hangul Compatibility Jamo",
+ "Kanbun",
+ "Bopomofo Extended",
+ "Katakana Phonetic Extensions",
+ "Enclosed CJK Letters and Months",
+ "CJK Compatibility",
+ "CJK Unified Ideographs Extension A",
+ "Yijing Hexagram Symbols",
+ "CJK Unified Ideographs",
+ "Yi Syllables",
+ "Yi Radicals",
+ "Hangul Syllables",
+ "Surrogates Area", // High Surrogates, High Private Use Surrogates, Low Surrogates
+ "Private Use Area",
+ "CJK Compatibility Ideographs",
+ "Alphabetic Presentation Forms",
+ "Arabic Presentation Forms-A",
+ "Variation Selectors",
+ "Combining Half Marks",
+ "CJK Compatibility Forms",
+ "Small Form Variants",
+ "Arabic Presentation Forms-B",
+ "Halfwidth and Fullwidth Forms",
+ "Specials",
+ "Linear B Syllabary",
+ "Linear B Ideograms",
+ "Aegean Numbers",
+ "Old Italic",
+ "Gothic",
+ "Ugaritic",
+ "Deseret",
+ "Shavian",
+ "Osmanya",
+ "Cypriot Syllabary",
+ "Byzantine Musical Symbols",
+ "Musical Symbols",
+ "Tai Xuan Jing Symbols",
+ "Mathematical Alphanumeric Symbols",
+ "CJK Unified Ideographs Extension B",
+ "CJK Compatibility Ideographs Supplement",
+ "Tags",
+ "Variation Selectors Supplement",
+ "Supplementary Private Use Area-A",
+ "Supplementary Private Use Area-B",
+ "Custom...",
+ };
+
+ private boolean useCustomRange = false;
+ private int[] customRange = { 0x0000, 0x007f };
+
+ /// Custom range dialog variables
+ private final JDialog customRangeDialog;
+ private final JTextField customRangeStart = new JTextField( "0000", 4 );
+ private final JTextField customRangeEnd = new JTextField( "007F", 4 );
+ private final int CUSTOM_RANGE_INDEX = UNICODE_RANGE_NAMES.length - 1;
+
+ /// Parent Font2DTest Object holder
+ private final Font2DTest parent;
+
+ public static final int SURROGATES_AREA_INDEX = 91;
+
+ public RangeMenu( Font2DTest demo, JFrame f ) {
+ super();
+ parent = demo;
+
+ for ( int i = 0; i < UNICODE_RANGE_NAMES.length; i++ )
+ addItem( UNICODE_RANGE_NAMES[i] );
+
+ setSelectedIndex( 0 );
+ addActionListener( this );
+
+ /// Set up custom range dialog...
+ customRangeDialog = new JDialog( f, "Custom Unicode Range", true );
+ customRangeDialog.setResizable( false );
+
+ JPanel dialogTop = new JPanel();
+ JPanel dialogBottom = new JPanel();
+ JButton okButton = new JButton("OK");
+ JLabel from = new JLabel( "From:" );
+ JLabel to = new JLabel("To:");
+ Font labelFont = new Font( "dialog", Font.BOLD, 12 );
+ from.setFont( labelFont );
+ to.setFont( labelFont );
+ okButton.setFont( labelFont );
+
+ dialogTop.add( from );
+ dialogTop.add( customRangeStart );
+ dialogTop.add( to );
+ dialogTop.add( customRangeEnd );
+ dialogBottom.add( okButton );
+ okButton.addActionListener( this );
+
+ customRangeDialog.getContentPane().setLayout( new BorderLayout() );
+ customRangeDialog.getContentPane().add( "North", dialogTop );
+ customRangeDialog.getContentPane().add( "South", dialogBottom );
+ customRangeDialog.pack();
+ }
+
+ /// Return the range that is currently selected
+
+ public int[] getSelectedRange() {
+ if ( useCustomRange ) {
+ int startIndex, endIndex;
+ String startText, endText;
+ String empty = "";
+ try {
+ startText = customRangeStart.getText().trim();
+ endText = customRangeEnd.getText().trim();
+ if ( startText.equals(empty) && !endText.equals(empty) ) {
+ endIndex = Integer.parseInt( endText, 16 );
+ startIndex = endIndex - 7*25;
+ }
+ else if ( !startText.equals(empty) && endText.equals(empty) ) {
+ startIndex = Integer.parseInt( startText, 16 );
+ endIndex = startIndex + 7*25;
+ }
+ else {
+ startIndex = Integer.parseInt( customRangeStart.getText(), 16 );
+ endIndex = Integer.parseInt( customRangeEnd.getText(), 16 );
+ }
+ }
+ catch ( Exception e ) {
+ /// Error in parsing the hex number ---
+ /// Reset the range to what it was before and return that
+ customRangeStart.setText( Integer.toString( customRange[0], 16 ));
+ customRangeEnd.setText( Integer.toString( customRange[1], 16 ));
+ return customRange;
+ }
+
+ if ( startIndex < 0 )
+ startIndex = 0;
+ if ( endIndex > 0xffff )
+ endIndex = 0xffff;
+ if ( startIndex > endIndex )
+ startIndex = endIndex;
+
+ customRange[0] = startIndex;
+ customRange[1] = endIndex;
+ return customRange;
+ }
+ else
+ return UNICODE_RANGES[ getSelectedIndex() ];
+ }
+
+ /// Function used by loadOptions in Font2DTest main panel
+ /// to reset setting and range selection
+ public void setSelectedRange( String name, int start, int end ) {
+ setSelectedItem( name );
+ customRange[0] = start;
+ customRange[1] = end;
+ parent.fireRangeChanged();
+ }
+
+ /// ActionListener interface function
+ /// ABP
+ /// moved JComboBox event code into this fcn from
+ /// itemStateChanged() method. Part of change to Swing.
+ public void actionPerformed( ActionEvent e ) {
+ Object source = e.getSource();
+
+ if ( source instanceof JComboBox ) {
+ String rangeName = (String)((JComboBox)source).getSelectedItem();
+
+ if ( rangeName.equals("Custom...") ) {
+ useCustomRange = true;
+ customRangeDialog.setLocationRelativeTo(parent);
+ customRangeDialog.show();
+ }
+ else {
+ useCustomRange = false;
+ }
+ parent.fireRangeChanged();
+ }
+ else if ( source instanceof JButton ) {
+ /// Since it is only "OK" button that sends any action here...
+ customRangeDialog.hide();
+ }
+ }
+}