1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * ident "%Z%%M% %I% %E% SMI"
24 *
25 * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28
29 import java.awt.*;
30 import java.awt.event.*;
31 import java.text.NumberFormat;
32 import java.util.ResourceBundle;
33 import java.util.MissingResourceException;
34
35 /**
36 * This creates a modal dialog box that lets the user enter a duration of
37 * time in seconds/minutes/hours/days/weeks/months/years.
38 */
39 public class DurationHelper extends Dialog {
40
41 private boolean save;
42
43 private Frame parent;
44
45 private Choice unit;
46 private TextField value;
47 private Label total;
48
49 private Button ok;
50 private Button cancel;
51 private Button help;
52 private Button compute;
53
54 private HelpDialog hd = null;
55
56 // For I18N
57 private static ResourceBundle rb =
58 ResourceBundle.getBundle("GuiResource" /* NOI18N */);
59 private static ResourceBundle hrb =
60 ResourceBundle.getBundle("HelpData" /* NOI18N */);
61
62 private static String[] units = { getString("Seconds"),
63 getString("Minutes"),
64 getString("Hours"),
65 getString("Days"),
66 getString("Weeks"),
67 getString("Months"),
68 getString("Years") };
69 private static int[] unitMultipliers = {1, 60, 60*60, 60*60*24,
70 60*60*24*7, 60*60*24*30,
71 60*60*24*365 };
72 private static NumberFormat nf = NumberFormat.getInstance();
73 private static Toolkit toolkit = Toolkit.getDefaultToolkit();
74
75 /**
76 * Constructor for DurationHelper.
77 * @param parent the parent Frame to whom input will be blocked
78 * while this dialog box is begin shown(modal behaviour).
79 */
80 public DurationHelper(Frame parent, Color background, Color foreground) {
81 super(parent, getString("SEAM Duration Helper"), true);
82
83 this.parent = parent;
84
85 setLayout(new GridBagLayout());
86 addLabels();
87 addFields(background, foreground);
88 addButtons();
89 setSize(350, 150);
90 setResizable(false);
91 addWindowListener(new DHWindowListener());
92 }
93
94 /**
95 * Adds all the labels.
96 */
97 private void addLabels() {
98 GridBagConstraints gbc = new GridBagConstraints();
99 gbc.weightx = gbc.weighty = 1;
100 add(new Label(getString("Unit")), gbc);
101 add(new Label(getString("Value")), gbc);
102
103 gbc.gridx = 3;
104 gbc.gridy = 0;
105 add(new Label(getString("Seconds")), gbc);
106 }
107
108 /**
109 * Initializes the strings for the units.
110 */
111 private void initUnits() {
112 unit = new Choice();
113 for (int i = 0; i < units.length; i++)
114 unit.add(units[i]);
115 unit.select(getString("Hours"));
116 unit.addItemListener(new ItemListener() {
117 public void itemStateChanged(ItemEvent e) {
118 DurationHelper.this.checkErrorAndSetTotal();
119 }
120 });
121 }
122
123 /**
124 * Adds all the fields
125 */
126 private void addFields(Color background, Color foreground) {
127 GridBagConstraints gbc = new GridBagConstraints();
128 gbc.weightx = gbc.weighty = 1;
129 initUnits();
130 value = new TextField();
131 value.setBackground(background);
132 value.setForeground(foreground);
133 value.setColumns(10);
134
135 // TBD: make total large enough to hold the largest int
136 total = new Label(" " /* NO18N */,
137 Label.RIGHT);
138 gbc.gridx = 0;
139 gbc.gridy = 1;
140 add(unit, gbc);
141 gbc.gridx = 1;
142 add(value, gbc);
143 gbc.gridx = 3;
144 add(total, gbc);
145
146 value.addActionListener(new ActionListener() {
147 public void actionPerformed(ActionEvent e) {
148 DurationHelper.this.durationHelperClose(true);
149 }
150 });
151 }
152
153 /**
154 * Adds all the buttons.
155 */
156 private void addButtons() {
157
158 GridBagConstraints gbc = new GridBagConstraints();
159 gbc.weightx = gbc.weighty = 1;
160
161 gbc.gridwidth = GridBagConstraints.REMAINDER;
162 gbc.fill = GridBagConstraints.BOTH;
163 gbc.gridx = 0;
164 gbc.gridy = 2;
165 gbc.insets = new Insets(0, 10, 0, 10);
166 add(new LineSeparator(), gbc);
167 gbc.insets = new Insets(0, 0, 0, 0);
168
169 Panel p = new Panel();
170 p.setLayout(new GridBagLayout());
171 ok = new Button(getString("OK"));
172 cancel = new Button(getString("Cancel"));
173 help = new Button(getString("Help"));
174 gbc = new GridBagConstraints();
175 gbc.weightx = gbc.weighty = 1;
176 p.add(ok, gbc);
177 p.add(cancel, gbc);
178 p.add(help, gbc);
179
180 ActionListener bl = new ButtonListener();
181 ok.addActionListener(bl);
182 cancel.addActionListener(bl);
183 help.addActionListener(bl);
184
185 gbc.gridy = 3;
186 gbc.gridwidth = GridBagConstraints.REMAINDER;
187 gbc.fill = GridBagConstraints.HORIZONTAL;
188 add(p, gbc);
189
190 gbc = new GridBagConstraints();
191 gbc.gridx = 2;
192 gbc.gridy = 1;
193 compute = new Button(getString("="));
194 add(compute, gbc);
195 compute.addActionListener(bl);
196
197 }
198
199 /**
200 * Updates the label called total.
201 * @return false if the text entry in the value
202 * field is not parseable, true otherwise.
203 */
204 private boolean checkErrorAndSetTotal() {
205 try {
206 String noSpaces = value.getText().trim();
207 value.setText(noSpaces);
208 Long l = Long.valueOf(noSpaces);
209 total.setText(nf.format(l.longValue() *
210 unitMultipliers[unit.getSelectedIndex()]));
211 } catch (NumberFormatException e) {
212 value.requestFocus();
213 value.selectAll();
214 toolkit.beep();
215 return false;
216 }
217
218 return true;
219 }
220
221 /**
222 * Hides the duration helper.
223 * @param save true if the user wants to save the current value in
224 * the dialog box, false if it is to be discarded. This is decided
225 * based on whether the user clicked on the "Ok" button or the
226 * "Cancel" button. Choosing the window close menu is equivalent to
227 * clicking on "Cancel."
228 */
229 private void durationHelperClose(boolean save) {
230 if (save == true) {
231 if (!checkErrorAndSetTotal())
232 return;
233 }
234 this.save = save;
235 setVisible(false);
236 }
237
238 /**
239 * Determine whether or not the user wanted to save the value in
240 * this Dialog box. The user indicates this by clicking on the Ok
241 * button to save it and on the Cancel button to discard it. Using the
242 * window close menu responds the same way as cancel.
243 * @return true if the user wanted to use this value,
244 * false if it is to be discarded.
245 */
246 public boolean isSaved() {
247 return save;
248 }
249
250 /**
251 * The string representation of the contents of this dialog box.
252 * @return a String with the total number of seconds entered.
253 */
254 public String toString() {
255 return total.getText();
256 }
257
258 // * **********************************************
259 // I N N E R C L A S S E S F O L L O W
260 // * **********************************************
261
262 /**
263 * Listener for closing the dialog box through the window close
264 * menu.
265 */
266 private class DHWindowListener extends WindowAdapter {
267 public void windowClosing(WindowEvent e) {
268 durationHelperClose(false);
269 }
270 }
271
272 /**
273 * Listener for all the buttons.
274 * The listener is shared for the sake
275 * of reducing the number of overall listeners.
276 */
277 private class ButtonListener implements ActionListener {
278 public void actionPerformed(ActionEvent e) {
279 if (e.getSource() == ok) {
280 DurationHelper.this.durationHelperClose(true);
281 } else if (e.getSource() == cancel) {
282 DurationHelper.this.durationHelperClose(false);
283 } else if (e.getSource() == help) {
284 if (hd != null)
285 hd.show();
286 else {
287 hd = new HelpDialog(DurationHelper. this.parent,
288 getString("Help for entering time duration"),
289 false, 5, 45);
290 hd.setVisible(true);
291 hd.setText(getString(hrb, "DurationHelperHelp"));
292 }
293 } else if (e.getSource() == compute) {
294 checkErrorAndSetTotal();
295 }
296 }
297 }
298
299 /**
300 * Call rb.getString(), but catch exception
301 * and return English
302 * key so that small spelling errors don't cripple the GUI
303 *
304 */
305 private static final String getString(String key) {
306 return (getString(rb, key));
307 }
308
309 private static final String getString(ResourceBundle rb, String key) {
310 try {
311 String res = rb.getString(key);
312 return res;
313 } catch (MissingResourceException e) {
314 System.out.println("Missing resource "+key+", using English.");
315 return key;
316 }
317 }
318
319 /*
320 * A main method to test this class.
321 */
322 /*
323 public static void main(String args[]) {
324 Frame f = new Frame("Test DurationHelper");
325 f.setVisible(true); // for help dialog to use this as parent
326 DurationHelper dh = new DurationHelper(f, Color.white, Color.black);
327 dh.setVisible(true);
328 System.out.println("Save is " + dh.save);
329 }
330 */
331 }