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