001 /* 002 * UnicodeCharInputPanel.java 003 * (C) chitec/Dirk Hillbrecht 2002, cantamen/Dirk Hillbrecht 2003. 004 * Modifications for BEE by T.J. Willis 005 * 006 * This program is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU General Public License 008 * as published by the Free Software Foundation; either version 2 009 * of the License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program; if not, write to the Free Software 018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. 019 * 020 * $Header: /cvsroot/pavlov/net/sourceforge/bee/UnicodeCharInputPanel.java,v 1.7 2004/06/24 07:56:15 tj_willis Exp $ 021 */ 022 package net.sourceforge.bee; 023 024 import java.awt.*; 025 import java.awt.font.*; 026 import java.awt.geom.*; 027 import java.awt.event.*; 028 import javax.swing.*; 029 030 // MODIFICATIONS: removed dependencies on biz.chitec.quarterback packages 031 // removed main method 032 // removed resourcebundle references 033 // reformatted with JavaStyle 034 // focusEvent tweaks 035 // commented out the get...Dialog methods. problemmatic in Swing MDI 036 // replacing some GridBag layout with BoxLayout 037 // new internal classes/accessors for JFrame/JDialog 038 // made appropriate parameters final 039 // added preview button 040 /** 041 * Panel to input any Java unicode character. 042 * 043 *@author chitec/Dirk Hillbrecht 2002, cantamen/Dirk Hillbrecht 2003. 044 * Distributed under the terms of the {@link <a 045 * href="http://www.fsf.org/copyleft/gpl.html">GNU GPL</a> }. 046 * 047 *@version $Id: UnicodeCharInputPanel.java,v 1.4 2003/11/18 22:34:27 048 * dirkhillbrecht Exp $ 049 */ 050 public class UnicodeCharInputPanel extends JPanel 051 { 052 053 private char[] hexchar = "0123456789ABCDEF".toCharArray(); 054 055 private final static Insets buttoninsets = new Insets(1, 2, 1, 2); 056 057 private BigToolTipJButton[] lowbutt; 058 private JLabel pagename; 059 private DisplayJButton preview; 060 private ButtonGroup[] uppernibblesbg; 061 private int upperbyte; 062 private String upperbytestring; 063 private Component eventsource; 064 private boolean postglobally; 065 private Component dispatchto; 066 private Box box; 067 068 069 public class UnicodeCharJFrame extends JFrame { 070 private UnicodeCharInputPanel pan; 071 072 public UnicodeCharJFrame() 073 { 074 super("Unicode Characters"); 075 pan = UnicodeCharInputPanel.this; 076 add(pan); 077 pack(); 078 setFocusable(false); 079 setFocusableWindowState(false); 080 } 081 082 public UnicodeCharInputPanel getUnicodeCharInputPanel(){ 083 return pan; 084 } 085 } 086 087 public class UnicodeCharJDialog extends JDialog { 088 private UnicodeCharInputPanel pan; 089 090 public UnicodeCharJDialog(Frame owner) 091 { 092 super(owner,"Unicode Characters",false); 093 pan = UnicodeCharInputPanel.this;//new UnicodeCharInputPanel(); 094 add(pan); 095 pack(); 096 setFocusable(false); 097 setFocusableWindowState(false); 098 } 099 100 public UnicodeCharInputPanel getUnicodeCharInputPanel(){ 101 return pan; 102 } 103 } 104 105 public UnicodeCharJDialog getJDialog(JFrame owner) 106 { 107 //UnicodeCharInputPanel pan = new UnicodeCharInputPanel(); 108 return new UnicodeCharJDialog(owner); 109 } 110 111 public UnicodeCharJFrame getJFrame() 112 { 113 //UnicodeCharInputPanel pan = new UnicodeCharInputPanel(); 114 return new UnicodeCharJFrame(); 115 } 116 117 /** 118 * Creates the Panel. 119 */ 120 public UnicodeCharInputPanel() 121 { 122 //super("Unicode Characters"); 123 super(); 124 javax.swing.ToolTipManager.sharedInstance().setEnabled(true); 125 //rb=RB.getBundle(this); 126 box = new Box(BoxLayout.Y_AXIS); 127 //setFocusable(false); 128 //setFocusableWindowState(false); 129 eventsource = this; 130 postglobally = false; 131 dispatchto = null; 132 JPanel upperbuttonspanel = new JPanel(new GridLayout(2, 16)); 133 uppernibblesbg = new ButtonGroup[2]; 134 ActionListener upbuttal = 135 new ActionListener() 136 { 137 public void actionPerformed(ActionEvent e) 138 { 139 setCharPage(uppernibblesbg[0].getSelection().getActionCommand() + 140 uppernibblesbg[1].getSelection().getActionCommand()); 141 } 142 }; 143 ActionListener lowbuttal = 144 new ActionListener() 145 { 146 public void actionPerformed(ActionEvent e) 147 { 148 typeChar(upperbytestring + ((AbstractButton) e.getSource()).getActionCommand()); 149 } 150 }; 151 for (int i = 0; i < 2; i++) { 152 uppernibblesbg[i] = new ButtonGroup(); 153 for (int j = 0; j < 16; j++) { 154 String ac = hexchar[j] + ""; 155 AbstractButton butt = new JToggleButton((i == 1 ? "x" : "") + ac + (i == 0 ? "x" : "")); 156 butt.setPreferredSize(new Dimension(32,32)); 157 butt.setFocusable(false); 158 butt.setRequestFocusEnabled(false); 159 butt.setActionCommand(ac); 160 butt.setMargin(buttoninsets); 161 butt.addActionListener(upbuttal); 162 upperbuttonspanel.add(butt); 163 butt.setSelected(j == 0); 164 uppernibblesbg[i].add(butt); 165 } 166 } 167 GridBagLayout gbl = new GridBagLayout(); 168 Box up = new Box(BoxLayout.X_AXIS); 169 up.setFocusable(false); 170 up.setRequestFocusEnabled(false); 171 172 173 preview = new DisplayJButton(); 174 preview.setText(" "); 175 preview.setMinimumSize(new Dimension(64,64)); 176 Font f = preview.getFont(); 177 Font g = f.deriveFont( 0,(float)(3.0*f.getSize())); 178 preview.setFont(g); 179 /* 180 Graphics2D g2 = (Graphics2D)preview.getGraphics(); 181 FontRenderContext frc = g2.getFontRenderContext(); 182 Rectangle2D r2 = g.getMaxCharBounds(frc); 183 System.out.println("rect is:" + r2); 184 */ 185 186 up.add(preview); 187 up.add(upperbuttonspanel); 188 189 pagename = new JLabel(" "); 190 Box centerpanel = new Box(BoxLayout.Y_AXIS); 191 192 JPanel lbp = new JPanel(new GridLayout(17, 17)); 193 lbp.setFocusable(false); 194 lbp.setRequestFocusEnabled(false); 195 lbp.add(new JPanel()); 196 for (int i = 0; i < 16; i++) { 197 lbp.add(new JLabel("x" + hexchar[i])); 198 } 199 int lbc = 0; 200 lowbutt = new BigToolTipJButton[256]; 201 for (int i = 0; i < 16; i++) { 202 lbp.add(new JLabel(hexchar[i] + "x")); 203 for (int j = 0; j < 16; j++) { 204 BigToolTipJButton butt = new BigToolTipJButton(); 205 //butt.setFocusable(false); 206 //butt.setRequestFocusEnabled(false); 207 butt.setActionCommand((i == 0 ? "0" : "") + Integer.toString(lbc, 16)); 208 butt.addActionListener(lowbuttal); 209 butt.setMargin(buttoninsets); 210 butt.setToolTipText("N/A"); 211 lbp.add(butt); 212 lowbutt[lbc++] = butt; 213 } 214 } 215 216 centerpanel.add(pagename); 217 centerpanel.add(lbp); 218 219 box.add( up); 220 box.add(centerpanel); 221 222 add(box); 223 //pack(); 224 setCharPage("00"); 225 } 226 227 228 /** 229 * Constructor for the UnicodeCharInputPanel object 230 * 231 *@param eventsourcex Description of the Parameter 232 */ 233 public UnicodeCharInputPanel(final Component eventsourcex) 234 { 235 this(); 236 setEventSource(eventsourcex); 237 } 238 239 240 /** 241 * Sets the eventSource attribute of the UnicodeCharInputPanel object 242 * 243 *@param eventsourcex The new eventSource value 244 */ 245 public void setEventSource(final Component eventsourcex) 246 { 247 eventsource = (eventsourcex == null ? this : eventsourcex); 248 } 249 250 251 /** 252 * Sets the dispatchTarget attribute of the UnicodeCharInputPanel object 253 * 254 *@param dispatchtox The new dispatchTarget value 255 */ 256 public void setDispatchTarget(Component dispatchtox) 257 { 258 dispatchto = dispatchtox; 259 } 260 261 262 /** 263 * Sets the postGlobally attribute of the UnicodeCharInputPanel object 264 * 265 *@param b The new postGlobally value 266 */ 267 public void setPostGlobally(final boolean b) 268 { 269 postglobally = b; 270 } 271 272 273 /** 274 * Sets the charPage attribute of the UnicodeCharInputPanel object 275 * 276 *@param ux The new charPage value 277 */ 278 private void setCharPage(final String ux) 279 { 280 upperbyte = Integer.parseInt(ux, 16) << 8; 281 int lastupperbyte = upperbyte + 255; 282 pagename.setText("Characters"); 283 upperbytestring = ux; 284 for (int i = 0; i < 256; i++) { 285 String ch = new Character((char) (upperbyte + i)).toString(); 286 lowbutt[i].setText(ch); 287 //lowbutt[i].setToolTip 288 } 289 //pack(); 290 } 291 292 private class DisplayJButton extends JButton 293 { 294 295 public Dimension getPreferredSize(){ 296 Dimension d= super.getPreferredSize(); 297 Dimension x = getSize(); 298 if(d.width>x.width) return d; 299 return x; 300 } 301 } 302 303 private class BigToolTipJButton extends JButton implements MouseListener 304 { 305 public BigToolTipJButton(){super();addMouseListener(this);} 306 307 //public 308 /* 309 public JToolTip createToolTip(){ 310 System.out.println("Creating tooltip"); 311 JToolTip t = new JToolTip(); 312 String s = this.getText(); 313 if(s==null) s = "N/A"; 314 t.setTipText(s); 315 Font f = this.getFont(); 316 Font g = f.deriveFont( (float)(4.0*f.getSize())); 317 t.setFont(g); 318 return t; 319 }*/ 320 321 322 public void mouseClicked(MouseEvent e){} 323 public void mouseEntered(MouseEvent e){preview.setText(getText());} 324 public void mouseExited(MouseEvent e){preview.setText(" ");} 325 public void mousePressed(MouseEvent e){} 326 public void mouseReleased(MouseEvent e){} 327 328 } 329 330 /** 331 * Sends the "typed" key to whomever it may concern. If postglobally is 332 * activated, the event is put into the global AWT event handling. Otherwise 333 * (and _only_ otherwise) if a certain dispatching target has been given, the 334 * event is passed there. 335 * 336 *@param cx Description of the Parameter 337 */ 338 private void typeChar(final String cx) 339 { 340 int code = Integer.parseInt(cx, 16); 341 System.out.println("code is: " + code); 342 Character ch = new Character((char) code); 343 AWTEvent theevent = new KeyEvent(eventsource, 344 KeyEvent.KEY_TYPED, 345 System.currentTimeMillis(), 346 0, 347 KeyEvent.VK_UNDEFINED, 348 ch.charValue()); 349 350 if (postglobally) { 351 Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(theevent); 352 } 353 else if (dispatchto != null) { 354 dispatchto.dispatchEvent(new FocusEvent(dispatchto, FocusEvent.FOCUS_GAINED)); 355 dispatchto.dispatchEvent(theevent); 356 } 357 } 358 } 359