Coverage Report - com.timjohnstondev.unitconverter.view.MolarMassPanel
 
Classes in this File Line Coverage Branch Coverage Complexity
MolarMassPanel
0%
0/108
0%
0/30
1.7
MolarMassPanel$1
N/A
N/A
1.7
MolarMassPanel$InputDocumentListener
0%
0/7
N/A
1.7
 
 1  
 /**
 2  
  * Copyright 2009 Timothy Johnston Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
 3  
  * file except in compliance with the License. You may obtain a copy of the License at
 4  
  * 
 5  
  * http://www.apache.org/licenses/LICENSE-2.0
 6  
  * 
 7  
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 8  
  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 9  
  * specific language governing permissions and limitations under the License.
 10  
  */
 11  
 package com.timjohnstondev.unitconverter.view;
 12  
 
 13  
 import java.awt.Color;
 14  
 import java.awt.Component;
 15  
 import java.awt.Font;
 16  
 import java.awt.GridLayout;
 17  
 import java.awt.Insets;
 18  
 import java.awt.event.ActionEvent;
 19  
 import java.awt.event.ActionListener;
 20  
 import java.awt.event.MouseEvent;
 21  
 import java.awt.event.MouseListener;
 22  
 import java.math.BigDecimal;
 23  
 import java.util.ResourceBundle;
 24  
 import javax.swing.JButton;
 25  
 import javax.swing.JLabel;
 26  
 import javax.swing.JPanel;
 27  
 import javax.swing.JTextField;
 28  
 import javax.swing.SwingConstants;
 29  
 import javax.swing.event.DocumentEvent;
 30  
 import javax.swing.event.DocumentListener;
 31  
 import com.timjohnstondev.unitconverter.controller.LogicController;
 32  
 
 33  
 /**
 34  
  * This panel displays all of the information regarding mole to mass and mass to mole conversions.
 35  
  */
 36  0
 public class MolarMassPanel extends JPanel implements Configuration, ActionListener, MouseListener
 37  
 {
 38  
   private UnitPanel unitPanel;
 39  
   private JButton mole2Mass;
 40  
   private JButton mass2Mole;
 41  
   private JButton neither;
 42  
   private JLabel massMoleLabel;
 43  
   private JTextField massMoleField;
 44  
   private JLabel massMoleFormula;
 45  
   private Object selectedButton;
 46  
   private ResourceBundle resources;
 47  
 
 48  
   /**
 49  
    * Constructs a {@code MolarMassPanel}
 50  
    * 
 51  
    * @param panel parent panel
 52  
    */
 53  
   public MolarMassPanel(final UnitPanel panel)
 54  0
   {
 55  0
     unitPanel = panel;
 56  0
     setLayout(new GridLayout(6, 1, 0, 3));
 57  0
     resources = ResourceBundle.getBundle("com.timjohnstondev.unitconverter.view.View");
 58  
 
 59  0
     mole2Mass = new JButton(resources.getString("MolarMassPanel.mole2Mass"));
 60  0
     mass2Mole = new JButton(resources.getString("MolarMassPanel.mass2Mole"));
 61  0
     neither = new JButton(resources.getString("MolarMassPanel.neither"));
 62  
 
 63  0
     massMoleLabel = new JLabel(resources.getString("MolarMassPanel.massMoleLabel"), SwingConstants.CENTER);
 64  0
     massMoleLabel.setToolTipText(resources.getString("MolarMassPanel.massMoleField"));
 65  0
     massMoleField = new JTextField();
 66  0
     massMoleField.setToolTipText(resources.getString("MolarMassPanel.massMoleField"));
 67  
 
 68  0
     massMoleField.setDocument(new InputFilter(resources.getString("MolarMassPanel.allowableCharacters")));
 69  0
     massMoleField.getDocument().addDocumentListener(new InputDocumentListener());
 70  0
     massMoleFormula = new JLabel("", SwingConstants.CENTER);
 71  
 
 72  0
     add(mole2Mass);
 73  0
     add(mass2Mole);
 74  0
     add(neither);
 75  0
     add(massMoleLabel);
 76  0
     add(massMoleField);
 77  0
     add(massMoleFormula);
 78  0
     configureButtons();
 79  0
   }
 80  
 
 81  
   /**
 82  
    * @return the molecular weight
 83  
    */
 84  
   final BigDecimal getMolecularWeightCorrection()
 85  
   {
 86  0
     final LogicController logicController = new LogicController();
 87  0
     return logicController.getMolecularWeightCorrection(massMoleField, mass2Mole, selectedButton, unitPanel
 88  
         .isMolUnitDivisor());
 89  
   }
 90  
 
 91  
   /**
 92  
    * @return {@code true} if mode is Mass to Mole, else false
 93  
    */
 94  
   final boolean isMassToMoleSelected()
 95  
   {
 96  0
     return mass2Mole == selectedButton;
 97  
   }
 98  
 
 99  
   private void setItemsVisible(final boolean isVisible)
 100  
   {
 101  0
     neither.setVisible(isVisible);
 102  0
     massMoleLabel.setVisible(isVisible);
 103  0
     massMoleField.setVisible(isVisible);
 104  0
     massMoleFormula.setVisible(isVisible);
 105  0
   }
 106  
 
 107  
   private void configureButtons()
 108  
   {
 109  0
     final Component[] components = getComponents();
 110  0
     for (Component component : components)
 111  
     {
 112  0
       if (component instanceof JButton)
 113  
       {
 114  0
         final JButton button = (JButton) component;
 115  0
         button.setMargin(new Insets(0, 0, 0, 0));
 116  0
         button.addActionListener(this);
 117  0
         button.addMouseListener(this);
 118  0
         button.setEnabled(false);
 119  
       }
 120  
     }
 121  0
   }
 122  
 
 123  
   @Override
 124  
   public final void actionPerformed(final ActionEvent event)
 125  
   {
 126  0
     if (event.getSource() == mole2Mass || event.getSource() == mass2Mole)
 127  
     {
 128  0
       setItemsVisible(true);
 129  0
       selectedButton = event.getSource();
 130  0
       unitPanel.updateFields();
 131  0
       updatePanelDisplays(event.getSource());
 132  
     }
 133  0
     if (event.getSource() == neither)
 134  
     {
 135  0
       setItemsVisible(false);
 136  0
       mole2Mass.setEnabled(false);
 137  0
       mass2Mole.setEnabled(false);
 138  0
       selectedButton = null;
 139  0
       massMoleField.setText(null);
 140  0
       unitPanel.clearMassMoleLabels();
 141  0
       unitPanel.updateFields();
 142  
     }
 143  0
   }
 144  
 
 145  
   private void updatePanelDisplays(final Object source)
 146  
   {
 147  0
     String text = resources.getString("MolarMassPanel.moleMassFormula");
 148  0
     String toolTipText = resources.getString("MolarMassPanel.moleMassFormulaToolTip");
 149  0
     final String altText = resources.getString("MolarMassPanel.massMoleFormula");
 150  0
     final String altToolTipText = resources.getString("MolarMassPanel.massMoleFormulaToolTip");
 151  
 
 152  0
     if (source == mole2Mass)
 153  
     {
 154  0
       mass2Mole.setEnabled(false);
 155  0
       unitPanel.updateMoleToMassLabels();
 156  0
       if (unitPanel.isMolUnitDivisor())
 157  
       {
 158  0
         text = altText;
 159  0
         toolTipText = altToolTipText;
 160  
       }
 161  
     }
 162  0
     else if (source == mass2Mole)
 163  
     {
 164  0
       mole2Mass.setEnabled(false);
 165  0
       unitPanel.updateMassToMoleLabels();
 166  
 
 167  0
       if (!unitPanel.isMolUnitDivisor())
 168  
       {
 169  0
         text = altText;
 170  0
         toolTipText = altToolTipText;
 171  
       }
 172  
     }
 173  0
     massMoleFormula.setText(text);
 174  0
     massMoleFormula.setToolTipText(toolTipText);
 175  0
   }
 176  
 
 177  
   @Override
 178  
   public final void setBackgroundColor(final Color color)
 179  
   {
 180  0
     setBackground(color);
 181  0
     final Component[] children = getComponents();
 182  0
     for (Component child : children)
 183  
     {
 184  0
       child.setBackground(color);
 185  
     }
 186  0
   }
 187  
 
 188  
   @Override
 189  
   public final void setFontSize(final float fontSize)
 190  
   {
 191  0
     final Font font = getFont().deriveFont(fontSize);
 192  0
     setFont(font);
 193  0
     final Component[] children = getComponents();
 194  0
     for (Component child : children)
 195  
     {
 196  0
       child.setFont(font);
 197  
     }
 198  0
   }
 199  
 
 200  
   @Override
 201  
   public final void setForegroundColor(final Color color)
 202  
   {
 203  0
     setForeground(color);
 204  0
     final Component[] children = getComponents();
 205  0
     for (Component child : children)
 206  
     {
 207  0
       child.setForeground(color);
 208  
     }
 209  0
   }
 210  
 
 211  
   @Override
 212  
   public void mouseClicked(final MouseEvent event)
 213  0
   {}
 214  
 
 215  
   @Override
 216  
   public final void mouseEntered(final MouseEvent event)
 217  
   {
 218  0
     event.getComponent().setEnabled(true);
 219  0
   }
 220  
 
 221  
   @Override
 222  
   public final void mouseExited(final MouseEvent event)
 223  
   {
 224  0
     if (selectedButton == null || event.getComponent() != selectedButton)
 225  
     {
 226  0
       event.getComponent().setEnabled(false);
 227  
     }
 228  0
   }
 229  
 
 230  
   @Override
 231  
   public void mousePressed(final MouseEvent event)
 232  0
   {}
 233  
 
 234  
   @Override
 235  
   public void mouseReleased(final MouseEvent event)
 236  0
   {}
 237  
 
 238  
   /**
 239  
    * Displays this {@code MolarMassPanel} with only the mole to mass and mass to mole buttons showing initially.
 240  
    * 
 241  
    * @param y this panel's new Y coordinate
 242  
    */
 243  
   final void showPanel(final int y)
 244  
   {
 245  0
     setVisible(true);
 246  0
     setItemsVisible(false);
 247  0
     massMoleField.setText(null);
 248  0
     setBounds(getX(), y, getWidth(), getHeight());
 249  0
     mole2Mass.setEnabled(false);
 250  0
     mass2Mole.setEnabled(false);
 251  0
     selectedButton = null;
 252  0
   }
 253  
 
 254  
   /**
 255  
    * Hides this {@code MolarMassPanel} usually because it is not appropriate for the given property
 256  
    */
 257  
   final void hidePanel()
 258  
   {
 259  0
     setVisible(false);
 260  0
     setItemsVisible(false);
 261  0
   }
 262  
 
 263  0
   private class InputDocumentListener implements DocumentListener
 264  
   {
 265  
     @Override
 266  
     public final void changedUpdate(final DocumentEvent e)
 267  
     {
 268  0
       unitPanel.updateFields();
 269  0
     }
 270  
 
 271  
     @Override
 272  
     public final void insertUpdate(final DocumentEvent e)
 273  
     {
 274  0
       changedUpdate(e);
 275  0
     }
 276  
 
 277  
     @Override
 278  
     public final void removeUpdate(final DocumentEvent e)
 279  
     {
 280  0
       changedUpdate(e);
 281  0
     }
 282  
   }
 283  
 }