001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.forms.store.properties;
031:
032: import java.awt.Component;
033: import java.awt.Container;
034: import java.io.IOException;
035:
036: import javax.swing.AbstractButton;
037: import javax.swing.ButtonGroup;
038:
039: import com.jeta.forms.components.panel.FormPanel;
040: import com.jeta.forms.gui.beans.JETABean;
041: import com.jeta.forms.gui.common.FormUtils;
042: import com.jeta.forms.gui.form.FormComponent;
043: import com.jeta.forms.store.JETAObjectInput;
044: import com.jeta.forms.store.JETAObjectOutput;
045:
046: /**
047: * This property is used to represent a button group assignment for a given
048: * radio button. Button groups on a form are identified by a group name. This
049: * property also provides the logic for creating and adding radio buttons to the
050: * groups at at runtime.
051: *
052: * @author Jeff Tassin
053: */
054: public class ButtonGroupProperty extends JETAProperty {
055: static final long serialVersionUID = 7814800168073274313L;
056:
057: /**
058: * The current version number of this class
059: */
060: public static final int VERSION = 1;
061:
062: /**
063: * The name of this group. We use group names to identify which group a
064: * button belongs to in a given form.
065: */
066: private String m_groupname;
067:
068: /**
069: * The name of this property
070: */
071: public static final String PROPERTY_ID = "buttonGroup";
072:
073: /**
074: * Creates a <code>ButtonGroupProperty</code> set to group "1"
075: */
076: public ButtonGroupProperty() {
077: super (PROPERTY_ID);
078: setGroupName("1");
079: }
080:
081: /**
082: * Creates a <code>ButtonGroupProperty</code> with the specified group
083: * name.
084: *
085: * @param groupName
086: * the name of the group to set.
087: */
088: public ButtonGroupProperty(String groupName) {
089: super (PROPERTY_ID);
090: setGroupName(groupName);
091: }
092:
093: /**
094: * Returns the name of the button group.
095: *
096: * @return the name of this group
097: */
098: public String getGroupName() {
099: return m_groupname;
100: }
101:
102: /**
103: * Sets the name of this group
104: *
105: * @param groupName
106: * the name of the group
107: */
108: public void setGroupName(String groupName) {
109: m_groupname = groupName;
110: }
111:
112: /**
113: * Sets this property to that of another ButtonGroupProperty.
114: *
115: * @param prop
116: * a ButtonGroupProperty instance.
117: */
118: public void setValue(Object prop) {
119: if (prop instanceof ButtonGroupProperty) {
120: ButtonGroupProperty bgp = (ButtonGroupProperty) prop;
121: setGroupName(bgp.getGroupName());
122: } else {
123: assert (false);
124: }
125: }
126:
127: /**
128: * PostInitialize is called once after all components in a form have been
129: * instantiated at runtime (not design time). This call allows properties to
130: * do last minute initializations to components that require the FormPanel
131: * instance which contains them. In this case we need to override because we
132: * use FormPanel to store the ButtonGroup instances. Adds the underlying
133: * JavaBean to the named button group in the panel.
134: *
135: * @param panel
136: * the panel that contains the radio buttons associated with this
137: * button group.
138: * @param bean
139: * the jetabean associated with this property
140: */
141: public void postInitialize(FormPanel panel, JETABean bean) {
142: String groupname = getGroupName();
143: if (groupname != null && groupname.length() > 0) {
144: FormUtils.safeAssert(bean != null);
145: if (bean != null) {
146: String groupkey = groupname;
147: /**
148: * here we need to handle the case where a bean that has this
149: * property is contained in a container such as JTabbedPane. In
150: * this case, any radio buttons in a tab view should be isolated
151: * from buttons in other views with respect to the button group.
152: * Since we use the FormPanel to hold the button groups, we need
153: * to distigush between the same group names but on different
154: * tabs. The hashCode is used for this
155: */
156: Container toplevelform = FormComponent
157: .getTopLevelForm(bean);
158: if (toplevelform != null) {
159: groupkey = String.valueOf(toplevelform.hashCode())
160: + "." + groupname;
161: }
162: ButtonGroup group = (ButtonGroup) panel.get(groupkey);
163: if (group == null) {
164: group = new ButtonGroup();
165: panel.put(groupkey, group);
166: }
167: Component javabean = bean.getDelegate();
168: if (javabean instanceof AbstractButton) {
169: AbstractButton btn = (AbstractButton) javabean;
170: group.add(btn);
171: }
172: }
173: }
174: }
175:
176: /**
177: * Updates the bean with the current value of this property
178: */
179: public void updateBean(JETABean jbean) {
180: // no op
181: }
182:
183: /**
184: * JETAPersistable Implementation
185: */
186: public void read(JETAObjectInput in) throws ClassNotFoundException,
187: IOException {
188: super .read(in.getSuperClassInput());
189: int version = in.readVersion();
190: m_groupname = (String) in.readObject("groupname");
191: }
192:
193: /**
194: * JETAPersistable Implementation
195: */
196: public void write(JETAObjectOutput out) throws IOException {
197: super .write(out.getSuperClassOutput(JETAProperty.class));
198: out.writeVersion(VERSION);
199: out.writeObject("groupname", m_groupname);
200: }
201:
202: }
|