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 ; 10 import java.awt.GridLayout ; 11 import java.awt.event.*; 12 import java.util.*; 13 import javax.swing.*; 14 15 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 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 (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 setTitle(I18N.get("AggregatesWin.title_prefix") + ' ' + fieldWidget); 74 } 75 76 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 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 104 protected void buildWindow(HashMap aggregates) { 105 JPanel editorPanel = buildAggregatesEditor(aggregates); 106 107 JPanel buttonPanel = closeButtonPanel(); 109 110 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 124 protected JPanel buildAggregatesEditor(HashMap aggregates) { 125 Object [] functionNames = AggregateField.functionNameArray(); 126 JPanel panel = new JPanel(); 127 panel.setLayout(new GridLayout (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 135 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 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 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 194 protected AggregateField getAggregateField() { 195 return getAggregateField(fieldWidget); 196 } 197 201 protected AggregateField getAggregateField(FieldWidget fw) { 202 return (AggregateField)fw.getField(); 203 } 204 205 protected void doSave() { 206 for (Iterator iter = slots.keySet().iterator(); iter.hasNext(); ) { 210 Object key = iter.next(); 211 Slot slot = (Slot)slots.get(key); 212 if (slot.checkBox.isSelected()) { 213 String 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 { 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 { if (slot.aggregate != null) { 234 String 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 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 parent.repaint(); 266 } 267 } 268 269 } 270 | Popular Tags |