/* * @(#)XChar.java 1.1.1 2 May 2006 * * Copyright 2006 * College of Computer and Information Science * Northeastern University * Boston, MA 02115 * * The Java Power Tools software may be used for educational * purposes as long as this copyright notice is retained intact * at the top of all source files. * * To discuss possible commercial use of this software, * contact Richard Rasala at Northeastern University, * College of Computer and Information Science, * 617-373-2462 or rasala@ccs.neu.edu. * * The Java Power Tools software has been designed and built * in collaboration with Viera Proulx and Jeff Raab. * * Should this software be modified, the words "Modified from * Original" must be included as a comment below this notice. * * All publication rights are retained. This software or its * documentation may not be published in any media either * in whole or in part without explicit permission. * * This software was created with support from Northeastern * University and from NSF grant DUE-9950829. */ package edu.neu.ccs; import edu.neu.ccs.console.*; import java.beans.*; import java.text.ParseException; /** *

Object wrapper for the primitive * char type that also provides * {@link Stringable Stringable} capabilities. * * The default value for this class is * the char 0.

* * @author Jeff Raab * @version 2.2 * @since 1.0 */ public class XChar extends XObject { /** The wrapped value of this object. */ private char value = 0; /** * Constructs a wrapper for the default * char value. * * @see #XChar(char) * @see #XChar(String) */ public XChar() {} /** * Constructs a wrapper for the given * char value. * * @param c the value to be wrapped * @see #XChar() * @see #XChar(String) */ public XChar(char c) { value = c; } /** * Constructs a wrapper for the char value * whose state information is encapsulated * in the given String data. * * @param s a String representation * of the desired value * @throws ParseException if the data is malformed * @see #XChar() * @see #XChar(char) */ public XChar(String s) throws ParseException { fromStringData(s); } //////////////// // Stringable // //////////////// public void fromStringData(String data) throws ParseException { char oldValue = value; if (data == null) throw new ParseException("Input was null.", -1); if (data.length() == 0) throw new ParseException("No input provided. ", -1); if (data.length() > 1) throw new ParseException("Provide one character only. ", 1); value = data.charAt(0); // report property change changeAdapter.firePropertyChange( VALUE, new Character(oldValue), data); } public String toStringData() { return value + ""; } //////////////// // Public API // //////////////// /** * Returns true if the wrapped object * is equal to the given object, and false * if it is not. * * @param other the object to be compared with the wrapped object */ public boolean equals(Object other) { if (other instanceof XChar) return getValue() == ((XChar)other).getValue(); return false; } /** * Returns an int hash code * appropriate for the wrapped object. */ public int hashCode() { return (new Character(getValue())).hashCode(); } /** * Returns a String representation * of the wrapped value. */ public String toString() { return value + ""; } /** * Sets the value wrapped by this object * to the given value. * * @param c the value to be wrapped * @see #getValue() */ public void setValue(char c) { char oldValue = value; value = c; // if the value has changed if (getValue() != oldValue) { // notify listeners of property change changeAdapter.firePropertyChange( VALUE, new Character(oldValue), new Character(getValue())); } } /** * Returns the value wrapped by this object. * * @see #setValue(char) */ public char getValue() { return value; } //////////////////// // Static methods // //////////////////// /** * Parses a char value from a String * using the current shared parser. * * @param s the String data to parse * @return the extracted char value * @throws NumberFormatException if the data is malformed */ public static char parseChar(String s) throws NumberFormatException { try { return (new XChar(s)).value; } catch (ParseException e) { throw new NumberFormatException( formatErrorMessage(e, s)); } } /** * Returns an array of primitive char values * copied from the given array * of XChar objects.

* * @param x an array of XChars * @return the resulting array * of char values * @see #toXArray(char[]) */ public static char[] toPrimitiveArray(XChar[] x) { // return null array if appropriate if (x == null) return null; // otherwise perform the type translation char[] temp = new char[x.length]; for (int i = 0; i < temp.length; i++) if (x[i] != null) temp[i] = x[i].getValue(); return temp; } /** * Returns an array of XChar objects * initialized from the given array * of char values. * * @param a an array of chars * @return the resulting array * of XChar objects * @see #toPrimitiveArray(XChar[]) */ public static XChar[] toXArray(char[] a) { // return null array if appropriate if (a == null) return null; // otherwise perform the type translation XChar[] temp = new XChar[a.length]; for (int i = 0; i < temp.length; i++) temp[i] = new XChar(a[i]); return temp; } }