KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jimm > datavision > layout > swing > SwingPageContents


1 package jimm.datavision.layout.swing;
2 import jimm.datavision.ErrorHandler;
3 import jimm.datavision.field.Field;
4 import jimm.datavision.field.ImageField;
5 import java.awt.Dimension JavaDoc;
6 import java.awt.CardLayout JavaDoc;
7 import javax.swing.JPanel JavaDoc;
8 import java.util.ArrayList JavaDoc;
9 import java.util.Iterator JavaDoc;
10
11 // This file also contains the SwingPageField class.
12

13 /**
14  * Holds report page contents and creates {@link SwingPage} instances
15  * when requested.
16  *
17  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
18  * @see SwingLE
19  * @see SwingPageField
20  */

21 class SwingPageContents {
22
23 ArrayList JavaDoc pageFields;
24 SwingPage page;
25 int pageNumber;
26 JPanel JavaDoc parent;
27 Dimension JavaDoc pageDim;
28 Thread JavaDoc buildThread;
29
30 /**
31  * Constructor.
32  *
33  * @param parent the panel in which this page will be displayed; its
34  * layout must be a <code>CardLayout</code>
35  * @param pageNumber the page number, starting at 1
36  * @param dim the page dimensions
37  */

38 SwingPageContents(JPanel JavaDoc parent, int pageNumber, Dimension JavaDoc dim) {
39     pageFields = new ArrayList JavaDoc();
40     this.pageNumber = pageNumber;
41     this.parent = parent;
42     pageDim = dim;
43 }
44
45 /**
46  * Adds a new field, its display value, and its position on the page.
47  *
48  * @param f a report field
49  * @param v the field's display value (retrieved from the database or
50  * otherwise calculated)
51  * @param r the display position and size
52  */

53 void add(Field f, String JavaDoc v, java.awt.Rectangle JavaDoc r) {
54     pageFields.add(new SwingPageField(f, v, r));
55 }
56
57 /**
58  * Returns <code>true</code> if the swing page has been built.
59  */

60 boolean isPageBuilt() { return page != null; }
61
62 /**
63  * Returns the swing page. If the page is being built, wait for the page
64  * building to complete before returning the page. If page construction
65  * has not started, build the page and return it.
66  *
67  * @return a <code>SwingPage</code>
68  */

69 SwingPage getPage() {
70     if (page == null) {
71     if (buildThread != null) { // Wait for page build to finish
72
try {
73         // One more check because the thread may have finished
74
if (buildThread != null) {
75             synchronized(buildThread) {
76             buildThread.join();
77             }
78         }
79         }
80         catch (InterruptedException JavaDoc e) {
81         ErrorHandler.error(e);
82         // page may be null
83
}
84     }
85     else
86         buildPage();
87     }
88     return page;
89 }
90
91 /**
92  * Displays the swing page, building it first if necessary.
93  */

94 void showPage() {
95     getPage(); // Make sure page completely built
96
CardLayout JavaDoc cardLayout = (CardLayout JavaDoc)parent.getLayout();
97     cardLayout.show(parent, "page " + pageNumber);
98 }
99
100 /**
101  * Builds the swing page and adds it to the parent, all in a separate
102  * thread. Calls {@link #buildPage}.
103  * <p>
104  * This isn't entirely thread safe, but it's close enough for our purposes.
105  */

106 void prebuildPage() {
107     if (page != null || buildThread != null)
108     return;
109
110     buildThread = new Thread JavaDoc(new Runnable JavaDoc() {
111     public void run() {
112         buildPage();
113         buildThread = null;
114     }
115     });
116     buildThread.start();
117 }
118
119 /**
120  * Builds the swing page and adds it to the parent.
121  */

122 void buildPage() {
123     SwingPage newPage = new SwingPage();
124     newPage.setPreferredSize(pageDim);
125
126     for (Iterator JavaDoc iter = pageFields.iterator(); iter.hasNext();) {
127     SwingPageField spf = (SwingPageField)iter.next();
128
129     // Create field and add to page.
130
SwingField sf;
131     if (spf.field instanceof ImageField)
132         sf = new SwingImageField((ImageField)spf.field);
133     else
134         sf = new SwingTextField(spf.field, spf.value);
135
136     sf.getComponent().setBounds(spf.rect);
137     newPage.add(sf.getComponent());
138     }
139
140     // Add page to parent
141
parent.add(newPage, "page " + pageNumber);
142
143     page = newPage;
144 }
145
146 /**
147  * Forgets the page we have built, removes it from its parent, and restores
148  * the field information so we can build the page later.
149  */

150 void forgetPage() {
151     if (!isPageBuilt())
152     return;
153
154     CardLayout JavaDoc cardLayout = (CardLayout JavaDoc)parent.getLayout();
155     cardLayout.removeLayoutComponent(page);
156     parent.remove(page);
157
158     page = null;
159 }
160 }
161
162 /**
163  * Holds a report field, its value when this instance is created, and
164  * a rectangle for page placement.
165  *
166  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
167  * @see SwingPage
168  * @see SwingLE
169  * @see SwingPageContents
170  */

171 class SwingPageField {
172
173 Field field;
174 String JavaDoc value;
175 java.awt.Rectangle JavaDoc rect;
176
177 /**
178  * Constructor.
179  *
180  * @param f a report field
181  * @param v the field's display value (retrieved from the database or
182  * otherwise calculated)
183  * @param r the display position and size
184  */

185 SwingPageField(Field f, String JavaDoc v, java.awt.Rectangle JavaDoc r) {
186     field = f;
187     value = v;
188     rect = r;
189 }
190 }
191
Popular Tags