Mega Code Archive

 
Categories / Java / Development Class
 

Unicode - show a page of Unicode characters

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.Label; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.MenuShortcut; import java.awt.Panel; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.DecimalFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; /**  * Unicode - show a page of Unicode characters. BUG: Times throws a bunch of  * exceptions on page 2 and 3, that can not be caught as they occur in the AWT  * thread. On some platforms.  *   * TODO - remove GoToPage as a dialog, move its textfield into main GUI.  *   * @author Ian Darwin, http://www.darwinsys.com/  * @version $Id: Unicode.java,v 1.7 2004/02/09 03:33:50 ian Exp $  */ public class Unicode extends JFrame {   /** "main program" method - construct and show */   public static void main(String[] av) {     // create a Unicode object, tell it to show up     new Unicode().setVisible(true);   }   protected final int COLUMNS = 16, ROWS = 16;   /** the unicode char at start of current page */   protected int startNum = 0;   protected final int QUADSIZE = ROWS * COLUMNS;   /** the buttons that display the characters */   protected JLabel buttons[][] = new JLabel[COLUMNS][ROWS];   /** the font name display */   protected JLabel fontName;   /** the row labels, in a column at the left */   protected JLabel rowLabs[] = new JLabel[ROWS];   /** The page chooser pop-up */   protected GoToPage gotoPageUI;   /** How git to make the font samples */   protected final int FONTSIZE = 8;   /** Construct the object including its GUI */   public Unicode() {     super("Unicode");     Container cp = getContentPane();     // Used both for Buttons and Menus     ResourceBundle b = ResourceBundle.getBundle("UnicodeWidgets");     JButton quitButton, nextButton, prevButton;     Panel p = new Panel();     // Make a grid, add one for labels.     p.setLayout(new GridLayout(ROWS + 1, COLUMNS + 1));     DecimalFormat df2d = new DecimalFormat("00");     // Add first row, just column labels.     p.add(new JLabel(""));     for (int i = 0; i < COLUMNS; i++)       p.add(new JLabel(Integer.toString(i, 16), JLabel.CENTER));     // Add subsequent rows, each with an offset label     for (int i = 0; i < ROWS; i++) {       JLabel l = new JLabel("0000"); // room for max, i.e. \uFFFF       p.add(l);       rowLabs[i] = l;       for (int j = 0; j < COLUMNS; j++) {         JLabel pb = new JLabel(" ");         buttons[j][i] = pb;         p.add(pb);       }     }     // ActionListeners for jumping around; used by buttons and menus     ActionListener firster = new ActionListener() {       public void actionPerformed(ActionEvent e) {         gotoPage(startNum = 0);       }     };     ActionListener previouser = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (startNum > 0)           gotoPage(startNum -= QUADSIZE);       }     };     ActionListener nexter = new ActionListener() {       public void actionPerformed(ActionEvent e) {         if (startNum < 65535)           gotoPage(startNum += QUADSIZE);       }     };     ActionListener laster = new ActionListener() {       public void actionPerformed(ActionEvent e) {         gotoPage(65536 - QUADSIZE);       }     };     cp.add(BorderLayout.NORTH, p);     fontName = new JLabel("Default font", JLabel.CENTER);     cp.add(BorderLayout.CENTER, fontName);     Panel q = new Panel();     cp.add(BorderLayout.SOUTH, q);     q.add(prevButton = mkButton(b, "page.prev"));     prevButton.addActionListener(previouser);     q.add(nextButton = mkButton(b, "page.next"));     nextButton.addActionListener(nexter);     q.add(quitButton = mkButton(b, "exit"));     quitButton.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         setVisible(false);         dispose();         System.exit(0);       }     });     addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         setVisible(false);         dispose();         System.exit(0);       }     });     MenuItem mi; // used in various spots     MenuBar mb = new MenuBar();     setMenuBar(mb);     String titlebar;     try {       titlebar = b.getString("program" + ".title");     } catch (MissingResourceException e) {       titlebar = "Unicode Demo";     }     setTitle(titlebar);     ActionListener fontSelector = new ActionListener() {       public void actionPerformed(ActionEvent e) {         String font = e.getActionCommand();         mySetFont(font, FONTSIZE);       }     };     Menu fontMenu = mkMenu(b, "font");     // String[] fontList = Toolkit.getDefaultToolkit().getFontList();     String[] fontList = GraphicsEnvironment.getLocalGraphicsEnvironment()         .getAvailableFontFamilyNames();     for (int i = 0; i < fontList.length; i++) {       fontMenu.add(mi = new MenuItem(fontList[i]));       mi.addActionListener(fontSelector);     }     mb.add(fontMenu);     gotoPageUI = new GoToPage("Unicode Page");     centre(gotoPageUI);     Menu vm = mkMenu(b, "page");     vm.add(mi = mkMenuItem(b, "page", "first"));     mi.addActionListener(firster);     vm.add(mi = mkMenuItem(b, "page", "prev"));     mi.addActionListener(previouser);     vm.add(mi = mkMenuItem(b, "page", "next"));     mi.addActionListener(nexter);     vm.add(mi = mkMenuItem(b, "page", "last"));     mi.addActionListener(laster);     vm.add(mi = mkMenuItem(b, "page", "goto"));     mi.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         Unicode.this.gotoPageUI.setVisible(true);       }     });     mb.add(vm);     Menu hm = mkMenu(b, "help");     hm.add(mi = mkMenuItem(b, "help", "about"));     mb.setHelpMenu(hm); // needed for portability (Motif, etc.).     pack();     // After packing the Frame, centre it on the screen.     centre(this);     // start at a known place     mySetFont(fontList[0], FONTSIZE);     gotoPage(startNum);   } // End of huge Constructor   private void mySetFont(String font, int sz) {     fontName.setText("Font = " + font);     Font f = new Font(font, Font.PLAIN, sz);     for (int i = 0; i < ROWS; i++) {       for (int j = 0; j < COLUMNS; j++)         buttons[i][j].setFont(f);     }     repaint();   }   public void centre(Window c) {     Dimension us = c.getSize(), them = Toolkit.getDefaultToolkit()         .getScreenSize();     int newX = (them.width - us.width) / 2;     int newY = (them.height - us.height) / 2;     c.setLocation(newX, newY);   }   /**    * Go to a given page of Unicode. At present the parameter is a code value,    * but it should be a page #.    */   private void gotoPage(int startNum) {     // System.out.println("startAt(" + startNum + ")");     char chars[] = new char[1];     for (int i = 0; i < ROWS; i++) {       JLabel l = rowLabs[i];       // System.out.println("i=" + i + ", JLabel=" + l);       l.setText(Integer.toString(startNum + (i * COLUMNS), 16));       // l.validate(); // size may be too big now       for (int j = 0; j < COLUMNS; j++) {         chars[0] = (char) (startNum + ((j * ROWS) + i));         JLabel b = buttons[i][j];         b.setText(new String(chars));       }     }     repaint();   }   /** Convenience routine to make a Button */   public JButton mkButton(ResourceBundle b, String name) {     String label;     try {       label = b.getString(name + ".label");     } catch (MissingResourceException e) {       label = name;     }     return new JButton(label);   }   /** Convenience routine to make a Menu */   public Menu mkMenu(ResourceBundle b, String name) {     String menuLabel;     try {       menuLabel = b.getString(name + ".label");     } catch (MissingResourceException e) {       menuLabel = name;     }     return new Menu(menuLabel);   }   /** Convenience routine to make a MenuItem */   public MenuItem mkMenuItem(ResourceBundle b, String menu, String name) {     String miLabel;     try {       miLabel = b.getString(menu + "." + name + ".label");     } catch (MissingResourceException e) {       miLabel = name;     }     String key = null;     try {       key = b.getString(menu + "." + name + ".key");     } catch (MissingResourceException e) {       key = null;     }     if (key == null)       return new MenuItem(miLabel);     else       return new MenuItem(miLabel, new MenuShortcut(key.charAt(0)));   }   /**    * Implement a simple "Go To Page" dialog Row one: "Go to Page", textfield    * second OK, Cancel buttons.    */   class GoToPage extends Frame {     /** TextField used to enter the number */     protected JTextField tf;     /** The OK button */     protected Button ok;     /** The cancel button */     protected Button can;     /** Construct a GoToPage window (no actions yet) */     public GoToPage(String title) {       setTitle(title);       Container cp = getContentPane();       Label l = new Label("Quadrant number (hex):");       tf = new JTextField(4);       tf.setText("1");       // set the text initially selected so you can easily overtype it       tf.selectAll();       ok = new Button("OK");       can = new Button("Cancel");       can.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           setVisible(false);         }       });       ActionListener doIt = new ActionListener() {         public void actionPerformed(ActionEvent e) {           int n = -1;           try {             n = getValue();           } catch (IllegalArgumentException notANumber) {             // handled below           }           if (n >= 0 && n <= 255) {             gotoPage(startNum = n * QUADSIZE);             setVisible(false);           } else             Toolkit.getDefaultToolkit().beep();         }       };       ok.addActionListener(doIt);       tf.addActionListener(doIt);       Panel top = new Panel();       top.add(l);       top.add(tf);       Panel bottom = new Panel();       bottom.add(ok);       bottom.add(can);       cp.add(BorderLayout.NORTH, top);       cp.add(BorderLayout.SOUTH, bottom);       pack();     }     protected int getValue() {       int i = Integer.parseInt(tf.getText(), 16);       return i;     }   } } //UnicodeWidgets.properties /* program.title=Unicode lister, by Ian Darwin # # The Exit button exit.label=Close # # The Font Family Menu # font.label=Font Family # font names, hence menuitems, are discovered from Toolkit by the program # # The Page Menu # page.label=Page page.first.label=Quadrant 0 (ASCII) page.first.key=F page.prev.label=Previous Quadrant page.prev.key=P page.next.label=Next Quadrant page.next.key=N page.last.label=Last Quadrant page.last.key=L page.goto.label=Goto Page... page.goto.key=G # # The Help Menu # help.label=Help help.about.label=About */