// $Id: QuantCostDialog.java,v 1.1 2007/01/30 16:21:23 jtrent Exp $
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import java.awt.Color;
import javax.swing.JFormattedTextField;
import java.text.NumberFormat;
import javax.swing.Box;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import javax.swing.RepaintManager;
import java.awt.Component;
import java.util.Date;
import javax.swing.text.JTextComponent;
/**
* QuantCostDialog allows input of currency values for costs and benefits,
* computes totals, and allows the user to print the result.
*
* @author Jason R Trent - jtrent@sandia.gov - Sandia National Laboratories
* @version $Revision: 1.1 $
*/
public class QuantCostDialog extends JDialog implements ActionListener, KeyListener, Printable
{
private SmoothJButton okButton,
printButton,
helpButton;
private JPanel navigationPanel,
interfacePanel,
dataPanel;
private SmoothJFormattedTextField acqCost,
mainCost,
opCost,
govGrantsBenefit,
rateIncBenefit,
otherRecoverBenefit,
diligenceBenefit,
cyberAvoidBenefit,
regComplianceBenefit,
secBusBenefit;
private SmoothJLabel totalCostLabel,
totalBenefitLabel,
totalLabel,
evalNameLabel,
evalProductLabel,
evalDateLabel;
private NumberFormat curFormat = NumberFormat.getCurrencyInstance();
private MainFrame mainFrameRef;
public QuantCostDialog( MainFrame mainFrameRef, String splash, Color color )
{
super( mainFrameRef,
VersionInfo.applicationTitle + " v " + VersionInfo.versionString,
true );
this.mainFrameRef = mainFrameRef;
Container c;
c = getContentPane();
c.setLayout( new BorderLayout( 10, 10 ) );
JPanel dialogPanel = new JPanel( new BorderLayout( 10, 10 ) );
setupButtons();
interfacePanel = new JPanel( new BorderLayout( 10, 10 ) );
if( navigationPanel != null )
interfacePanel.add( navigationPanel, BorderLayout.SOUTH );
setupFields();
dialogPanel.add( interfacePanel, BorderLayout.CENTER );
add( new I3PGraphicsPanel( splash, color ), BorderLayout.WEST );
add( dialogPanel );
setMinimumSize( new Dimension( mainFrameRef.getMinimumSize().width,
mainFrameRef.getMinimumSize().height ) );
setPreferredSize( new Dimension( mainFrameRef.getPreferredSize().width,
mainFrameRef.getPreferredSize().height ) );
setMaximumSize( new Dimension( mainFrameRef.getMaximumSize().width,
mainFrameRef.getMaximumSize().height ) );
setSize( new Dimension( mainFrameRef.getSize().width,
mainFrameRef.getSize().height ) );
setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
centerOnDisplay();
dialogPanel.setVisible( true );
pack();
setVisible( true );
}
private void centerOnDisplay()
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension size = getSize();
setLocation( (screenSize.width - size.width)/2,
(screenSize.height - size.height)/2 );
return;
}
private void setupButtons()
{
navigationPanel = new JPanel();
navigationPanel.setLayout( new BorderLayout() );
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.X_AXIS ) );
okButton = new SmoothJButton( "End" );
okButton.addActionListener( this );
buttonPanel.add( okButton );
navigationPanel.add( buttonPanel, BorderLayout.EAST );
JPanel helpPrintPanel = new JPanel();
helpPrintPanel.setLayout( new BoxLayout( helpPrintPanel, BoxLayout.X_AXIS ) );
printButton = new SmoothJButton( "Print" );
printButton.addActionListener( this );
helpPrintPanel.add( printButton );
helpButton = new SmoothJButton( "Help" );
helpButton.addActionListener( this );
helpPrintPanel.add( helpButton );
JPanel infoPanel = new JPanel( new BorderLayout() );
SmoothJLabel infoLabel = new SmoothJLabel( "<html>Values must be annualized or total for<br>the estimated life of the product</html>" );
infoLabel.setFont( infoLabel.getFont().deriveFont( 10f ) );
infoLabel.setAlignmentX( Component.CENTER_ALIGNMENT );
infoPanel.add( Box.createRigidArea( new Dimension( 5, 0 ) ), BorderLayout.WEST );
infoPanel.add( infoLabel, BorderLayout.CENTER );
navigationPanel.add( infoPanel, BorderLayout.CENTER );
navigationPanel.add( helpPrintPanel, BorderLayout.WEST );
return;
}
private void setupFields()
{
dataPanel = new JPanel( new BorderLayout( 10, 10 ) );
JPanel fieldPanel = new JPanel();
fieldPanel.setLayout( new BoxLayout( fieldPanel, BoxLayout.Y_AXIS ) );
if( mainFrameRef.getEvalProductName() != "" )
{
evalNameLabel = new SmoothJLabel( "<html><font size=+1>" + mainFrameRef.getEvalProductName() + "</font></html>", SwingConstants.CENTER );
evalNameLabel.setAlignmentX( Component.CENTER_ALIGNMENT );
fieldPanel.add( evalNameLabel );
}
if( mainFrameRef.getEvaluatorName() != "" )
{
evalProductLabel = new SmoothJLabel( "<html>Evaluated by " + mainFrameRef.getEvaluatorName() + "</html>", SwingConstants.CENTER );
evalProductLabel.setAlignmentX( Component.CENTER_ALIGNMENT );
fieldPanel.add( evalProductLabel );
}
String evalDataString = new SimpleDateFormat( "MMMMM dd, yyyy" ).format(new Date());
evalDateLabel = new SmoothJLabel( "<html>Evaluated " + evalDataString + "</html>", SwingConstants.CENTER );
evalDateLabel.setAlignmentX( Component.CENTER_ALIGNMENT );
fieldPanel.add( evalDateLabel );
fieldPanel.add( Box.createRigidArea( new Dimension( 0, 10 ) ) );
JPanel acqPanel = new JPanel( new BorderLayout() );
acqPanel.add( new SmoothJLabel( "Acquisition/Installation Costs" ),
BorderLayout.CENTER );
acqCost = new SmoothJFormattedTextField( curFormat );
acqCost.setValue( 0.00 );
acqCost.setColumns( 10 );
acqCost.addKeyListener( this );
acqPanel.add( new SmoothJLabel( "Total Cost of Ownership of Security Product:" ), BorderLayout.NORTH );
acqPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
acqPanel.add( acqCost, BorderLayout.EAST );
fieldPanel.add( acqPanel );
JPanel mainPanel = new JPanel( new BorderLayout() );
mainPanel.add( new SmoothJLabel( "Maintenance Costs" ),
BorderLayout.CENTER );
mainCost = new SmoothJFormattedTextField( curFormat );
mainCost.setValue( 0.00 );
mainCost.setColumns( 10 );
mainCost.addKeyListener( this );
mainPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
mainPanel.add( mainCost, BorderLayout.EAST );
fieldPanel.add( mainPanel );
JPanel opPanel = new JPanel( new BorderLayout() );
opPanel.add( new SmoothJLabel( "Operations Costs" ),
BorderLayout.CENTER );
opCost = new SmoothJFormattedTextField( curFormat );
opCost.setValue( 0.00 );
opCost.setColumns( 10 );
opCost.addKeyListener( this );
opPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
opPanel.add( opCost, BorderLayout.EAST );
fieldPanel.add( opPanel );
JPanel totalPanel = new JPanel( new BorderLayout() );
totalPanel.add( new SmoothJLabel( "Total Cost" ),
BorderLayout.CENTER );
totalCostLabel = new SmoothJLabel( "$0.00" );
totalPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
totalPanel.add( totalCostLabel, BorderLayout.EAST );
fieldPanel.add( totalPanel );
JPanel govGrantsPanel = new JPanel( new BorderLayout() );
govGrantsPanel.add( new SmoothJLabel( "Government Security Grants" ),
BorderLayout.CENTER );
govGrantsBenefit = new SmoothJFormattedTextField( curFormat );
govGrantsBenefit.setValue( 0.00 );
govGrantsBenefit.setColumns( 10 );
govGrantsBenefit.addKeyListener( this );
govGrantsPanel.add( new SmoothJLabel( "Cost Recovery:" ), BorderLayout.NORTH );
govGrantsPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
govGrantsPanel.add( govGrantsBenefit, BorderLayout.EAST );
fieldPanel.add( govGrantsPanel );
JPanel rateIncPanel = new JPanel( new BorderLayout() );
rateIncPanel.add( new SmoothJLabel( "Allowable Rate Increases" ),
BorderLayout.CENTER );
rateIncBenefit = new SmoothJFormattedTextField( curFormat );
rateIncBenefit.setValue( 0.00 );
rateIncBenefit.setColumns( 10 );
rateIncBenefit.addKeyListener( this );
rateIncPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
rateIncPanel.add( rateIncBenefit, BorderLayout.EAST );
fieldPanel.add( rateIncPanel );
JPanel otherRecoverPanel = new JPanel( new BorderLayout() );
otherRecoverPanel.add( new SmoothJLabel( "Other Cost Recovery Methods" ),
BorderLayout.CENTER );
otherRecoverBenefit = new SmoothJFormattedTextField( curFormat );
otherRecoverBenefit.setValue( 0.00 );
otherRecoverBenefit.setColumns( 10 );
otherRecoverBenefit.addKeyListener( this );
otherRecoverPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
otherRecoverPanel.add( otherRecoverBenefit, BorderLayout.EAST );
fieldPanel.add( otherRecoverPanel );
JPanel diligencePanel = new JPanel( new BorderLayout() );
diligencePanel.add( new SmoothJLabel( "Legal Cost Avoidance (due diligence)" ),
BorderLayout.CENTER );
diligenceBenefit = new SmoothJFormattedTextField( curFormat );
diligenceBenefit.setValue( 0.00 );
diligenceBenefit.setColumns( 10 );
diligenceBenefit.addKeyListener( this );
diligencePanel.add( new SmoothJLabel( "Benefits and Cost Avoidance:" ), BorderLayout.NORTH );
diligencePanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
diligencePanel.add( diligenceBenefit, BorderLayout.EAST );
fieldPanel.add( diligencePanel );
JPanel cyberAvoidPanel = new JPanel( new BorderLayout() );
cyberAvoidPanel.add( new SmoothJLabel( "Cyberattack Incident Cost Avoidance" ),
BorderLayout.CENTER );
cyberAvoidBenefit = new SmoothJFormattedTextField( curFormat );
cyberAvoidBenefit.setValue( 0.00 );
cyberAvoidBenefit.setColumns( 10 );
cyberAvoidBenefit.addKeyListener( this );
cyberAvoidPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
cyberAvoidPanel.add( cyberAvoidBenefit, BorderLayout.EAST );
fieldPanel.add( cyberAvoidPanel );
JPanel regCompliancePanel = new JPanel( new BorderLayout() );
regCompliancePanel.add( new SmoothJLabel( "Regulation Compliance Cost Avoidance" ),
BorderLayout.CENTER );
regComplianceBenefit = new SmoothJFormattedTextField( curFormat );
regComplianceBenefit.setValue( 0.00 );
regComplianceBenefit.setColumns( 10 );
regComplianceBenefit.addKeyListener( this );
regCompliancePanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
regCompliancePanel.add( regComplianceBenefit, BorderLayout.EAST );
fieldPanel.add( regCompliancePanel );
JPanel secBusPanel = new JPanel( new BorderLayout() );
secBusPanel.add( new SmoothJLabel( "Security Enabled Business Advantage" ),
BorderLayout.CENTER );
secBusBenefit = new SmoothJFormattedTextField( curFormat );
secBusBenefit.setValue( 0.00 );
secBusBenefit.setColumns( 10 );
secBusBenefit.addKeyListener( this );
secBusPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
secBusPanel.add( secBusBenefit, BorderLayout.EAST );
fieldPanel.add( secBusPanel );
totalPanel = new JPanel( new BorderLayout() );
totalPanel.add( new SmoothJLabel( "Total Benefit" ),
BorderLayout.CENTER );
totalBenefitLabel = new SmoothJLabel( "$0.00" );
totalPanel.add( Box.createRigidArea( new Dimension( 15, 0 ) ), BorderLayout.WEST );
totalPanel.add( totalBenefitLabel, BorderLayout.EAST );
fieldPanel.add( totalPanel );
fieldPanel.add( Box.createRigidArea( new Dimension( 0, 5 ) ) );
totalPanel = new JPanel( new BorderLayout() );
totalPanel.add( new SmoothJLabel( "Total" ),
BorderLayout.CENTER );
totalLabel = new SmoothJLabel( "$0.00" );
totalPanel.add( totalLabel, BorderLayout.EAST );
fieldPanel.add( totalPanel );
dataPanel.add( fieldPanel, BorderLayout.NORTH );
interfacePanel.add( dataPanel, BorderLayout.CENTER );
}
public void keyReleased( KeyEvent event )
{
try
{
if( event.getSource() instanceof SmoothJFormattedTextField )
((SmoothJFormattedTextField)event.getSource()).commitEdit();
updateTotals();
}
catch( ParseException exception )
{
String currentValue = ((JTextComponent)event.getSource()).getText();
try
{
Number numForm = NumberFormat.getNumberInstance().parse( currentValue );
currentValue = "$" + currentValue;
((SmoothJFormattedTextField)event.getSource()).setValue( numForm );
((SmoothJFormattedTextField)event.getSource()).setCaretPosition( currentValue.length() );
updateTotals();
}
catch( ParseException parseException )
{}
catch( IllegalArgumentException illegalArgumentException )
{}
}
}
public void actionPerformed( ActionEvent event )
{
if( event.getSource() == okButton )
setVisible( false );
else if( event.getSource() == helpButton )
popupHelpDialog();
else if( event.getSource() == printButton )
printQuantitative();
return;
}
public void popupHelpDialog()
{
setVisible( false );
new HelpDialogFrame( mainFrameRef, HelpDialog.QUANTITATIVE, "Help", StringRadarGraph.BLUEFILL );
setVisible( true );
return;
}
public int print( Graphics g, PageFormat pageFormat, int pageIndex )
{
if( pageIndex > 0 )
{
return NO_SUCH_PAGE;
}
else
{
Graphics2D g2d = (Graphics2D) g;
g2d.translate( pageFormat.getImageableX (), pageFormat.getImageableY () );
RepaintManager currentManager = RepaintManager.currentManager( this);
currentManager.setDoubleBufferingEnabled( false );
dataPanel.paint( g2d );
currentManager.setDoubleBufferingEnabled( true );
return PAGE_EXISTS;
}
}
public void printQuantitative()
{
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable( this );
if( printJob.printDialog() )
{
try
{
printJob.print();
}
catch( PrinterException pe )
{
System.out.println("Error printing: " + pe);
}
}
return;
}
private void updateTotals()
{
double totalCostValue = ((Number)acqCost.getValue()).doubleValue() +
((Number)mainCost.getValue()).doubleValue() +
((Number)opCost.getValue()).doubleValue();
double totalBenefitValue = ((Number)govGrantsBenefit.getValue()).doubleValue() +
((Number)rateIncBenefit.getValue()).doubleValue() +
((Number)otherRecoverBenefit.getValue()).doubleValue() +
((Number)diligenceBenefit.getValue()).doubleValue() +
((Number)cyberAvoidBenefit.getValue()).doubleValue() +
((Number)regComplianceBenefit.getValue()).doubleValue() +
((Number)secBusBenefit.getValue()).doubleValue();
double totalValue = totalBenefitValue - totalCostValue;
totalCostLabel.setText( curFormat.format( -1 * totalCostValue ) );
if( totalCostValue > 0.0 )
totalCostLabel.setForeground( Color.RED );
else
totalCostLabel.setForeground( Color.BLACK );
totalBenefitLabel.setText( curFormat.format( totalBenefitValue ) );
if( totalBenefitValue > 0.0 )
totalBenefitLabel.setForeground( Color.GREEN.darker() );
else
totalBenefitLabel.setForeground( Color.BLACK );
totalLabel.setText( curFormat.format( totalValue ) );
if( totalValue < 0.0 )
totalLabel.setForeground( Color.RED );
else if( totalValue > 0.0 )
totalLabel.setForeground( Color.GREEN.darker() );
else
totalLabel.setForeground( Color.BLACK );
return;
}
public void keyTyped( KeyEvent event ) {}
public void keyPressed( KeyEvent event ) {}
};