KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jimm > datavision > gui > AggregatesWin


1 package jimm.datavision.gui;
2 import jimm.datavision.*;
3 import jimm.datavision.field.Field;
4 import jimm.datavision.field.AggregateField;
5 import jimm.datavision.gui.cmd.NewAggregateCommand;
6 import jimm.datavision.gui.cmd.EditAggregateFuncCommand;
7 import jimm.datavision.gui.cmd.DeleteAggregateCommand;
8 import jimm.util.I18N;
9 import java.awt.BorderLayout JavaDoc;
10 import java.awt.GridLayout JavaDoc;
11 import java.awt.event.*;
12 import java.util.*;
13 import javax.swing.*;
14
15 /**
16  * An aggregates editor for a single field that lets the user add and delete
17  * aggregates at each level (group footers, report footer). Never called
18  * when multiple fields are selected.
19  *
20  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
21  */

22 public class AggregatesWin extends EditWin {
23
24 static class Slot {
25
26 FieldWidget aggregate;
27 boolean existedAlready;
28 JCheckBox checkBox;
29 JComboBox functionMenu;
30
31 Slot(FieldWidget fw, JCheckBox cb, JComboBox menu) {
32     existedAlready = fw != null;
33     aggregate = fw;
34     checkBox = cb;
35     functionMenu = menu;
36 }
37 }
38
39 protected static final int TEXT_FIELD_COLS = 8;
40
41 protected Report report;
42 protected FieldWidget fieldWidget;
43 protected HashMap slots;
44
45 /**
46  * Constructor.
47  *
48  * @param designer the window to which this dialog belongs
49  * @param fw a field widget
50  */

51 public AggregatesWin(Designer designer, FieldWidget fw) {
52     super(designer, I18N.get("AggregatesWin.title_prefix") + ' ' + fw,
53       "AggregatesWin.command_name");
54
55     fieldWidget = fw;
56     report = designer.report;
57
58     // If we have been handed a aggregate field's widget, find the widget of
59
// the original field.
60
if (fieldWidget.getField() instanceof AggregateField) {
61     final Field fieldToAggregate = getAggregateField().getField();
62     final FieldWidget[] list = new FieldWidget[1];
63
64     designer.withWidgetsDo(new FieldWidgetWalker() {
65         public void step(FieldWidget fw) {
66         Field f = fw.getField();
67         if (f == fieldToAggregate)
68             list[0] = fw;
69         }
70         });
71     fieldWidget = list[0];
72     // Reset window title
73
setTitle(I18N.get("AggregatesWin.title_prefix") + ' ' + fieldWidget);
74     }
75
76     // Create a hash that maps either a group or a report footer section to
77
// the associated existing aggregate widget.
78
final HashMap aggregates = new HashMap();
79     final AbstractList subs =
80     designer.report.getAggregateFieldsFor(fieldWidget.getField());
81     designer.withWidgetsDo(new FieldWidgetWalker() {
82     public void step(FieldWidget fw) {
83         Field f = fw.getField();
84         if (subs.contains(f)) {
85         Object JavaDoc key = ((AggregateField)f).getGroup();
86         if (key == null)
87             key = fw.getField().getSection();
88         aggregates.put(key, fw);
89         }
90     }
91     });
92
93     buildWindow(aggregates);
94     pack();
95     setVisible(true);
96 }
97
98 /**
99  * Builds the window contents.
100  *
101  * @param aggregates a hash that maps either a group or a report footer
102  * section to the associated existing aggregate widget
103  */

104 protected void buildWindow(HashMap aggregates) {
105     JPanel editorPanel = buildAggregatesEditor(aggregates);
106
107     // OK, Apply, Revert, and Cancel Buttons
108
JPanel buttonPanel = closeButtonPanel();
109
110     // Add title, values, and buttons to window
111
getContentPane().add(new JLabel(I18N.get("AggregatesWin.title_prefix")
112                     + ' ' + fieldWidget),
113              BorderLayout.NORTH);
114     getContentPane().add(editorPanel, BorderLayout.CENTER);
115     getContentPane().add(buttonPanel, BorderLayout.SOUTH);
116 }
117
118 /**
119  * Builds the editor widget panel.
120  *
121  * @param aggregates a hash that maps either a group or a report footer
122  * section to the associated existing aggregate widget
123  */

124 protected JPanel buildAggregatesEditor(HashMap aggregates) {
125     Object JavaDoc[] functionNames = AggregateField.functionNameArray();
126     JPanel panel = new JPanel();
127     panel.setLayout(new GridLayout JavaDoc(0, 1));
128     panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
129     JCheckBox cb = null;
130     JComboBox menu = null;
131     slots = new HashMap();
132
133     // For each footer in the report, create a checkbox and a slot.
134

135     // Group footer sections
136
int i = report.countGroups();
137     for (Iterator iter = report.groupsReversed(); iter.hasNext(); --i) {
138     Group g = (Group)iter.next();
139     FieldWidget fw = (FieldWidget)aggregates.get(g);
140
141     cb = new JCheckBox(I18N.get("AggregatesWin.group") + " #" + i + " ("
142                + g.getSelectableName() + ")");
143     panel.add(cb);
144     menu = new JComboBox(functionNames);
145     panel.add(menu);
146     if (fw != null) {
147         cb.setSelected(true);
148         menu.setSelectedItem(getAggregateField(fw).getFunction());
149     }
150     slots.put(g, new Slot(fw, cb, menu));
151     }
152
153     // Report footer sections
154
cb = new JCheckBox(I18N.get("AggregatesWin.grand_total"));
155     panel.add(cb);
156     menu = new JComboBox(functionNames);
157     panel.add(menu);
158     boolean addedSlot = false;
159     for (Iterator iter = report.footers().iterator();
160      iter.hasNext() && !addedSlot; )
161     {
162     Section s = (Section)iter.next();
163     FieldWidget fw = (FieldWidget)aggregates.get(s);
164     if (fw != null) {
165         cb.setSelected(true);
166         menu.setSelectedItem(getAggregateField(fw).getFunction());
167         slots.put(null, new Slot(fw, cb, menu));
168         addedSlot = true;
169     }
170     }
171     if (!addedSlot)
172     slots.put(null, new Slot(null, cb, menu));
173
174     // Add an "all" button
175
JButton all = new JButton(I18N.get("GUI.all"));
176     all.addActionListener(new ActionListener() {
177     public void actionPerformed(ActionEvent e) {
178         for (Iterator iter = slots.values().iterator();
179          iter.hasNext(); )
180         ((Slot)iter.next()).checkBox.setSelected(true);
181     }
182     });
183     JPanel buttonPanel = new JPanel();
184     buttonPanel.add(all);
185     panel.add(buttonPanel);
186
187     return panel;
188 }
189
190 /**
191  * Return the <code>AggregateField</code> associated with the ivar
192  * <var>fieldWidget</var>. Convenience method.
193  */

194 protected AggregateField getAggregateField() {
195     return getAggregateField(fieldWidget);
196 }
197 /**
198  * Return the <code>AggregateField</code> associated with <var>fw</var>.
199  * Convenience method.
200  */

201 protected AggregateField getAggregateField(FieldWidget fw) {
202     return (AggregateField)fw.getField();
203 }
204
205 protected void doSave() {
206     // Hide existing aggregates that are unchecked and show existing
207
// aggregates that are checked. For checked aggregates, modify function
208
// (no harm done if function is not changed).
209
for (Iterator iter = slots.keySet().iterator(); iter.hasNext(); ) {
210     Object JavaDoc key = iter.next();
211     Slot slot = (Slot)slots.get(key);
212     if (slot.checkBox.isSelected()) {
213       String JavaDoc functionName = slot.functionMenu.getSelectedItem().toString();
214         if (slot.aggregate == null) {
215         NewAggregateCommand cmd =
216             new NewAggregateCommand(report, fieldWidget, (Group)key,
217                        functionName);
218         cmd.perform();
219         commands.add(cmd);
220
221         slot.aggregate = cmd.getAggregateWidget();
222         }
223         else { // Already have one; change to selected func
224
EditAggregateFuncCommand cmd =
225             new EditAggregateFuncCommand(getAggregateField(slot.aggregate),
226                          functionName);
227         cmd.perform();
228         commands.add(cmd);
229         getAggregateField(slot.aggregate).setFunction(functionName);
230         }
231     }
232     else { // We don't want an aggregate for this slot
233
if (slot.aggregate != null) {
234             String JavaDoc functionName =
235             getAggregateField(slot.aggregate).getFunction();
236         DeleteAggregateCommand cmd =
237             new DeleteAggregateCommand(report, fieldWidget,
238                            slot.aggregate, functionName,
239                            (Group)key);
240         cmd.perform();
241         commands.add(cmd);
242         slot.aggregate = null;
243         }
244     }
245     }
246 }
247
248 protected void doRevert() {
249     for (Iterator iter = slots.keySet().iterator(); iter.hasNext(); ) {
250     Slot slot = (Slot)slots.get(iter.next());
251     java.awt.Component JavaDoc parent = slot.aggregate.getComponent().getParent();
252     if (slot.existedAlready) {
253         slot.aggregate.getComponent().setVisible(true);
254         slot.checkBox.setSelected(true);
255     }
256     else {
257         if (slot.aggregate != null) {
258         slot.aggregate.doDelete();
259         slot.aggregate = null;
260         }
261         slot.checkBox.setSelected(false);
262     }
263     // For some reason we need to force a repaint of the section. Can't
264
//just call invalidate.
265
parent.repaint();
266     }
267 }
268
269 }
270
Popular Tags