blob: 6a465785c170ab3f3da7620744d6e23b1bf3f03f [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25package sun.beans.editors;
26
27import java.awt.Component;
28import java.awt.Graphics;
29import java.awt.Rectangle;
30import java.beans.PropertyChangeEvent;
31import java.beans.PropertyChangeListener;
32import java.beans.PropertyEditor;
33import java.util.ArrayList;
34import java.util.List;
35
36/**
37 * Property editor for java.lang.Enum subclasses.
38 *
39 * @see PropertyEditor
40 *
41 * @since 1.7
42 *
43 * @author Sergey A. Malenkov
44 */
45public final class EnumEditor implements PropertyEditor {
46 private final List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
47
48 private final Class type;
49 private final String[] tags;
50
51 private Object value;
52
53 public EnumEditor( Class type ) {
54 Object[] values = type.getEnumConstants();
55 if ( values == null ) {
56 throw new IllegalArgumentException( "Unsupported " + type );
57 }
58 this.type = type;
59 this.tags = new String[values.length];
60 for ( int i = 0; i < values.length; i++ ) {
61 this.tags[i] = ( ( Enum )values[i] ).name();
62 }
63 }
64
65 public Object getValue() {
66 return this.value;
67 }
68
69 public void setValue( Object value ) {
70 if ( ( value != null ) && ( this.type != value.getClass() ) ) {
71 throw new IllegalArgumentException( "Unsupported value: " + value );
72 }
73 Object oldValue;
74 PropertyChangeListener[] listeners;
75 synchronized ( this.listeners ) {
76 oldValue = this.value;
77 this.value = value;
78
79 if ( ( value == null ) ? oldValue == null : value.equals( oldValue ) ) {
80 return; // do not fire event if value is not changed
81 }
82 int size = this.listeners.size();
83 if ( size == 0 ) {
84 return; // do not fire event if there are no any listener
85 }
86 listeners = this.listeners.toArray( new PropertyChangeListener[size] );
87 }
88 PropertyChangeEvent event = new PropertyChangeEvent( this, null, oldValue, value );
89 for ( PropertyChangeListener listener : listeners ) {
90 listener.propertyChange( event );
91 }
92 }
93
94 public String getAsText() {
95 return ( this.value != null )
96 ? ( ( Enum )this.value ).name()
97 : null;
98 }
99
100 public void setAsText( String text ) {
101 setValue( ( text != null )
102 ? Enum.valueOf( this.type, text )
103 : null );
104 }
105
106 public String[] getTags() {
107 return this.tags.clone();
108 }
109
110 public String getJavaInitializationString() {
111 String name = getAsText();
112 return ( name != null )
113 ? this.type.getName() + '.' + name
114 : "null";
115 }
116
117 public boolean isPaintable() {
118 return false;
119 }
120
121 public void paintValue( Graphics gfx, Rectangle box ) {
122 }
123
124 public boolean supportsCustomEditor() {
125 return false;
126 }
127
128 public Component getCustomEditor() {
129 return null;
130 }
131
132 public void addPropertyChangeListener( PropertyChangeListener listener ) {
133 synchronized ( this.listeners ) {
134 this.listeners.add( listener );
135 }
136 }
137
138 public void removePropertyChangeListener( PropertyChangeListener listener ) {
139 synchronized ( this.listeners ) {
140 this.listeners.remove( listener );
141 }
142 }
143}