/** * Copyright (c) 2012, Lindsay Bradford and other Contributors. * All rights reserved. * * This program and the accompanying materials are made available * under the terms of the BSD 3-Clause licence which accompanies * this distribution, and is available at * http://opensource.org/licenses/BSD-3-Clause */ package blacksmyth.personalfinancier.view.inflation; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.GregorianCalendar; import java.util.Observable; import java.util.Observer; import java.util.Vector; import javax.swing.JComponent; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import blacksmyth.general.BlacksmythSwingUtilities; import blacksmyth.personalfinancier.control.inflation.InflationConversionController; import blacksmyth.personalfinancier.model.inflation.InflationConversionModel; import blacksmyth.personalfinancier.view.WidgetFactory; public class InflationConversionPanel extends JPanel implements Observer { private GregorianCalendar earliestDate; private GregorianCalendar latestDate; private GridBagLayout gbl = new GridBagLayout(); private GridBagConstraints gbc = new GridBagConstraints(); private Vector<JComponent> labels = new Vector<JComponent>(); private Vector<JComponent> fields = new Vector<JComponent>(); private JFormattedTextField initialDateField = WidgetFactory.createDateTextField(); private JFormattedTextField initialValueField = WidgetFactory.createAmountTextField(); private JFormattedTextField conversionDateField = WidgetFactory.createDateTextField(); private JFormattedTextField conversionValueField = WidgetFactory.createAmountTextField(); private JFormattedTextField inflationOverPeriodField = WidgetFactory.createPercentTextField(); private JFormattedTextField inflationPerAnnumField = WidgetFactory.createPercentTextField(); private JLabel dateRangeLabel; private InflationConversionController controller; public InflationConversionPanel(InflationConversionController controller) { super(); this.controller = controller; setLayout(gbl); createView(); } private void createView() { gbc.insets = new Insets(0,5,5,5); gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.25; gbc.weighty = 0; addFieldPair( new JLabel("Initial Date :"), initialDateField, 0,0 ); final JFormattedTextField initialDateFieldFinal = this.initialDateField; this.initialDateField.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { controller.setInitialDate( initialDateFieldFinal.getText() ); } } ); addFieldPair( new JLabel("Initial Value :"), initialValueField, 0,1 ); final JFormattedTextField initialValueFieldFinal = this.initialValueField; this.initialValueField.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { controller.setInitialValue( initialValueFieldFinal.getText() ); } } ); addFieldPair( new JLabel("Conversion Date :"), conversionDateField, 2,0 ); final JFormattedTextField conversionDateFieldFinal = this.conversionDateField; this.conversionDateField.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { controller.setConversionDate( conversionDateFieldFinal.getText() ); } } ); addFieldPair( new JLabel("Conversion Value :"), conversionValueField, 2,1 ); final JFormattedTextField conversionValueFieldFinal = this.conversionValueField; this.conversionValueField.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { controller.setConversionValue( conversionValueFieldFinal.getText() ); } } ); gbc.insets = new Insets(10,5,5,5); addFieldPair( new JLabel("Inflation :"), inflationOverPeriodField, 0,3 ); inflationOverPeriodField.setEnabled(false); fields.add(inflationOverPeriodField); addFieldPair( new JLabel("Inflation / Annum :"), inflationPerAnnumField, 2,3 ); inflationPerAnnumField.setEnabled(false); fields.add(inflationPerAnnumField); gbc.insets = new Insets(10,5,5,5); BlacksmythSwingUtilities.equalizeComponentSizes(labels); BlacksmythSwingUtilities.equalizeComponentSizes(fields); labels.clear(); fields.clear(); dateRangeLabel = new JLabel(getDateRangeMessage()); dateRangeLabel.setHorizontalAlignment(SwingConstants.CENTER); gbc.insets = new Insets(12,0,0,0); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridx = 0; gbc.gridy = 4; gbc.weightx = 1; add(dateRangeLabel, gbc); } private String getDateRangeMessage() { final String earliestDateString = dateToString(earliestDate); final String latestDateString = dateToString(latestDate); return "CPI calculations cover the date range " + earliestDateString + " - " + latestDateString + "."; } private String dateToString(GregorianCalendar date) { if (date == null) { return ""; } return WidgetFactory.DATE_FORMAT.format( date.getTime() ); } protected void addFieldPair(JLabel label, JFormattedTextField field, int gridX, int gridY) { label.setHorizontalAlignment(SwingConstants.RIGHT); gbc.anchor = GridBagConstraints.EAST; gbc.gridx = gridX; gbc.gridy = gridY; add(label, gbc); gbc.anchor = GridBagConstraints.WEST; gbc.gridx = gridX + 1; add(field, gbc); labels.add(label); fields.add(field); } @Override public void update(Observable o, Object arg) { assert o.getClass().equals(InflationConversionModel.class) : "View/Model mismatch."; InflationConversionModel model = (InflationConversionModel) o; this.initialDateField.setValue( model.getInitialDate().getTime() ); this.initialValueField.setValue( model.getInitialValue().getTotal().doubleValue() ); this.conversionDateField.setValue( model.getConversionDate().getTime() ); this.conversionValueField.setValue( model.getConversionValue().getTotal().doubleValue() ); this.inflationOverPeriodField.setValue( model.getInflationOverPeriod() ); this.inflationPerAnnumField.setValue( model.getInflationPerAnnum() ); this.earliestDate = (GregorianCalendar) model.getEarliestDate(); this.latestDate = (GregorianCalendar) model.getLatestLatestDate(); dateRangeLabel.setText( getDateRangeMessage() ); } }