KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jimm > datavision > gui > sql > VisTableWin


1 package jimm.datavision.gui.sql;
2 import jimm.datavision.*;
3 import jimm.datavision.gui.Designer;
4 import jimm.datavision.gui.EditWin;
5 import jimm.datavision.source.*;
6 import jimm.datavision.gui.cmd.TableJoinCommand;
7 import jimm.util.I18N;
8 import java.awt.BorderLayout JavaDoc;
9 import java.awt.event.ActionListener JavaDoc;
10 import java.awt.event.ActionEvent JavaDoc;
11 import java.util.*;
12 import javax.swing.*;
13
14 /**
15  * The dialog used for defining joins between database tables. Eventually,
16  * this will be nice and graphical.
17  * <p>
18  * This dialog should only be created if the report uses more than one table.
19  * The method {@link Designer#enableMenuItems} makes sure this is true.
20  *
21  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
22  */

23 public class VisTableWin extends EditWin implements ActionListener JavaDoc {
24
25 /* ================================================================ */
26 static class RevertInfo {
27 ArrayList joins;
28 RevertInfo(Query q) {
29     joins = new ArrayList();
30     for (Iterator iter = q.joins(); iter.hasNext(); ) {
31     Join j = (Join)iter.next();
32     joins.add(j.clone());
33     }
34 }
35 }
36
37 /* ================================================================ */
38 static class JoinFields {
39
40 Join join; // If null, it's a newly created join
41
JCheckBox del;
42 JComboBox from;
43 JComboBox relation;
44 JComboBox to;
45
46 JoinFields(Join j, DataSource db) {
47     join = j;
48     del = new JCheckBox();
49     from = buildColDropdown((j == null) ? null : j.getFrom(), db);
50     relation = buildRelDropdown((j == null) ? null : j.getRelation());
51     to = buildColDropdown((j == null) ? null : j.getTo(), db);
52 }
53
54 protected JComboBox buildColDropdown(Column col, DataSource db) {
55     JComboBox cb = new JComboBox();
56
57     // Get iterator over tables actually used by the report. Will be
58
// null if the data source does not have tables.
59
for (Iterator iter = db.columnsInTablesUsedInReport(); iter.hasNext(); ) {
60     Column c = (Column)iter.next();
61     cb.addItem(c.fullName());
62     if (col != null && col.equals(c))
63         cb.setSelectedItem(c.fullName());
64     }
65
66     return cb;
67 }
68
69 protected JComboBox buildRelDropdown(String JavaDoc rel) {
70     JComboBox cb = new JComboBox(Join.RELATIONS);
71     if (rel != null)
72     cb.setSelectedItem(rel);
73     return cb;
74 }
75 }
76
77 /* ================================================================ */
78
79 protected Report report;
80 protected Query query;
81 protected ArrayList joinFieldsList;
82 protected JPanel joinsPanel;
83 protected Box delCheckBoxPanel;
84 protected Box fromPanel;
85 protected Box relationPanel;
86 protected Box toPanel;
87 protected JButton deleteButton;
88
89 /**
90  * Constructor.
91  *
92  * @param designer the window to which this dialog belongs
93  * @param report the...um...I forgot
94  */

95 public VisTableWin(Designer designer, Report report) {
96     this(designer, report, report.getDataSource().getQuery());
97 }
98
99 /**
100  * Constructor.
101  *
102  * @param designer the window to which this dialog belongs
103  * @param report the...um...I forgot
104  * @param query a query
105  */

106 public VisTableWin(Designer designer, Report report, Query query) {
107     super(designer, I18N.get("VisTableWin.title"), "TableJoinCommand.name");
108     this.report = report;
109     this.query = query;
110
111     buildWindow();
112     pack();
113     setVisible(true);
114 }
115
116 /**
117  * Builds the window contents.
118  */

119 protected void buildWindow() {
120     // Joins
121
buildJoinsPanel();
122
123     // Add/Delete buttons
124
JPanel addDelButtons = new JPanel();
125     JButton button = new JButton(I18N.get("VisTableWin.add"));
126     button.addActionListener(this);
127     addDelButtons.add(button);
128
129     deleteButton = new JButton(I18N.get("VisTableWin.delete_selected"));
130     deleteButton.addActionListener(this);
131     addDelButtons.add(deleteButton);
132
133     // Panel containing joins and add/delete buttons
134
JPanel centerPanel = new JPanel();
135     centerPanel.setLayout(new BorderLayout JavaDoc());
136     centerPanel.add(joinsPanel, BorderLayout.CENTER);
137     centerPanel.add(addDelButtons, BorderLayout.SOUTH);
138
139     // OK, Apply, Revert, and Cancel Buttons
140
JPanel buttonPanel = closeButtonPanel();
141
142     // Add tables and buttons to window
143
getContentPane().add(centerPanel, BorderLayout.CENTER);
144     getContentPane().add(buttonPanel, BorderLayout.SOUTH);
145 }
146
147 protected void buildJoinsPanel() {
148     joinsPanel = new JPanel();
149     joinsPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
150
151     Box panel = Box.createHorizontalBox();
152     joinsPanel.add(panel);
153
154     delCheckBoxPanel = Box.createVerticalBox();
155     fromPanel = Box.createVerticalBox();
156     relationPanel = Box.createVerticalBox();
157     toPanel = Box.createVerticalBox();
158
159     fillJoinsPanel();
160
161     panel.add(delCheckBoxPanel);
162     panel.add(fromPanel);
163     panel.add(relationPanel);
164     panel.add(toPanel);
165 }
166
167 protected void fillJoinsPanel() {
168     joinFieldsList = new ArrayList();
169     for (Iterator iter = query.joins(); iter.hasNext(); ) {
170     Join j = (Join)iter.next();
171     joinFieldsList.add(new JoinFields(j, report.getDataSource()));
172     }
173
174     for (Iterator iter = joinFieldsList.iterator(); iter.hasNext(); ) {
175     JoinFields jf = (JoinFields)iter.next();
176     delCheckBoxPanel.add(jf.del);
177     fromPanel.add(jf.from);
178     relationPanel.add(jf.relation);
179     toPanel.add(jf.to);
180     }
181 }
182
183 protected void emptyJoinsPanel() {
184     delCheckBoxPanel.removeAll();
185     fromPanel.removeAll();
186     relationPanel.removeAll();
187     toPanel.removeAll();
188 }
189
190 /**
191  * Handles add and delete buttons.
192  */

193 public void actionPerformed(ActionEvent JavaDoc e) {
194     String JavaDoc cmd = e.getActionCommand();
195     if (cmd.equals(I18N.get("VisTableWin.add")))
196     addNewJoin();
197     else if (cmd.equals(I18N.get("VisTableWin.delete_selected")))
198     deleteSelectedJoins();
199     else
200     super.actionPerformed(e);
201 }
202
203 protected void addNewJoin() {
204     JoinFields jf = new JoinFields(null, report.getDataSource());
205     joinFieldsList.add(jf);
206
207     delCheckBoxPanel.add(jf.del);
208     fromPanel.add(jf.from);
209     relationPanel.add(jf.relation);
210     toPanel.add(jf.to);
211
212     joinsPanel.invalidate();
213     pack();
214 }
215
216 protected void deleteSelectedJoins() {
217     ArrayList copy = (ArrayList)joinFieldsList.clone();
218     for (Iterator iter = copy.iterator(); iter.hasNext(); ) {
219     JoinFields jf = (JoinFields)iter.next();
220     if (jf.del.isSelected()) {
221         joinFieldsList.remove(jf);
222
223         delCheckBoxPanel.remove(jf.del);
224         fromPanel.remove(jf.from);
225         relationPanel.remove(jf.relation);
226         toPanel.remove(jf.to);
227     }
228     }
229     joinsPanel.invalidate();
230     pack();
231 }
232
233 protected void doSave() {
234     ArrayList newJoins = new ArrayList();
235     for (Iterator iter = joinFieldsList.iterator(); iter.hasNext(); ) {
236     JoinFields jf = (JoinFields)iter.next();
237     Column from = columnFromDropdown(jf.from);
238     String JavaDoc relation = (String JavaDoc)jf.relation.getSelectedItem();
239     Column to = columnFromDropdown(jf.to);
240
241     newJoins.add(new Join(from, relation, to));
242     }
243
244     TableJoinCommand cmd = new TableJoinCommand(query, newJoins);
245     cmd.perform();
246     commands.add(cmd);
247 }
248
249 protected Column columnFromDropdown(JComboBox cb) {
250     String JavaDoc sel = (String JavaDoc)cb.getSelectedItem();
251     return report.findColumn(sel);
252 }
253
254 protected void doRevert() {
255     // Rebuild widgets
256
emptyJoinsPanel();
257     fillJoinsPanel();
258     joinsPanel.invalidate();
259     pack();
260 }
261
262 }
263
264
Popular Tags