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.gui.form;
031:
032: import java.awt.Component;
033: import java.awt.Container;
034:
035: import com.jeta.forms.components.panel.FormPanel;
036: import com.jeta.forms.gui.beans.JETABean;
037:
038: /**
039: * A FormContainerComponent is a standard Swing component that can have embedded
040: * forms as children. An example of type type of component is a JTabbedPane. A
041: * JTabbedPane is a StandardComponent in our architecture; however, it is the
042: * only GridComponent besides a FormComponent that can have embedded forms as
043: * children. We have this specialized class for the sole purpose of propagating
044: * gridcomponent events up the forms hierarchy when in design mode. JSplitPanes
045: * are not currrently supported, but they would also be an example of a
046: * FormContainerComponent.
047: *
048: * @author Jeff Tassin
049: */
050: public class FormContainerComponent extends StandardComponent implements
051: GridViewListener {
052:
053: /**
054: * Creates an uninitialized <code>FormContainerComponent</code> instance.
055: */
056: public FormContainerComponent() {
057:
058: }
059:
060: /**
061: * Creates a <code>FormContainerComponent</code> instance with the
062: * specified parent view.
063: *
064: * @param parentView
065: * the view that contains this component
066: */
067: public FormContainerComponent(GridView parentView) {
068: super (parentView);
069: }
070:
071: /**
072: * Creates a <code>FormContainerComponent</code> instance with the
073: * specified jetabean and parent view.
074: *
075: * @param jbean
076: * a JETABean that contains a Swing component that can contain an
077: * embedded form. Currently, we are limited to JTabbedPane (or in
078: * the future a JSplitPane).
079: * @param parentView
080: * the view that contains this component
081: */
082: public FormContainerComponent(JETABean jbean, GridView parentView) {
083: super (jbean, parentView);
084: }
085:
086: /**
087: * If this component is selected, then it is returned. Otherise, this call
088: * is forwarded to any nested forms contained by this component.
089: *
090: * @returns the first selected component it finds in the component hierarhcy
091: * of this container.
092: */
093: public GridComponent getSelectedComponent() {
094: if (isSelected())
095: return this ;
096:
097: Component comp = getBeanDelegate();
098: if (comp instanceof Container)
099: return getSelectedComponent((Container) comp);
100:
101: return null;
102: }
103:
104: /**
105: * Returns the first selected GridComponent found in the specified component
106: * hierarchy.
107: *
108: * @returns the first selected component it finds in the component hierarhcy
109: * of this container.
110: */
111: public GridComponent getSelectedComponent(Container cc) {
112: if (cc == null)
113: return null;
114:
115: for (int index = 0; index < cc.getComponentCount(); index++) {
116: Component comp = cc.getComponent(index);
117: if (comp instanceof FormComponent) {
118: FormComponent fc = (FormComponent) comp;
119: GridComponent gc = fc.getSelectedComponent();
120: if (gc != null)
121: return gc;
122: } else if (comp instanceof FormContainerComponent) {
123: FormContainerComponent fc = (FormContainerComponent) comp;
124: GridComponent gc = fc.getSelectedComponent();
125: if (gc != null)
126: return gc;
127: } else if (comp instanceof GridComponent) {
128: GridComponent gc = (GridComponent) comp;
129: if (gc.isSelected())
130: return gc;
131: }
132: }
133: return null;
134: }
135:
136: /**
137: * GridViewListener implementation. Forwards any GridView events from any
138: * nested forms to any GridCellListeners on this component.
139: */
140: public void gridChanged(GridViewEvent evt) {
141: if (evt.getId() == GridViewEvent.EDIT_COMPONENT) {
142: if (evt.getComponentEvent() != null)
143: fireGridCellEvent(evt.getComponentEvent());
144:
145: } else if (evt.getId() == GridViewEvent.CELL_SELECTED) {
146: if (evt.getComponentEvent() != null)
147: fireGridCellEvent(evt.getComponentEvent());
148: } else {
149: if (evt.getComponentEvent() != null)
150: fireGridCellEvent(evt.getComponentEvent());
151: }
152: }
153:
154: /**
155: * PostInitialize is called once after all components in a form have been
156: * re-instantiated at runtime (not design time). This gives each property
157: * and component a chance to do some last minute initializations that might
158: * depend on the top level parent. FormComponent simply forwards the call to
159: * any children.
160: */
161: public void _postInitialize(FormPanel panel, Container cc) {
162: if (cc == null)
163: return;
164:
165: for (int index = 0; index < cc.getComponentCount(); index++) {
166: Component comp = cc.getComponent(index);
167: if (comp instanceof GridComponent)
168: ((GridComponent) comp).postInitialize(panel);
169: else if (comp instanceof Container)
170: _postInitialize(panel, (Container) comp);
171: }
172: }
173:
174: /**
175: * PostInitialize is called once after all components in a form have been
176: * re-instantiated at runtime (not design time). This gives each property
177: * and component a chance to do some last minute initializations that might
178: * depend on the top level parent. FormComponent simply forwards the call to
179: * any children.
180: */
181: public void postInitialize(FormPanel panel) {
182: super .postInitialize(panel);
183: if (this .getBeanDelegate() instanceof Container) {
184: _postInitialize(panel, (Container) this.getBeanDelegate());
185: }
186: }
187:
188: }
|