/* * PayCollateralDialog.java * * Copyright (c) 2009 Jay Lawson <jaylawson39 at yahoo.com>. All rights reserved. * * This file is part of MekHQ. * * MekHQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MekHQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see <http://www.gnu.org/licenses/>. */ package mekhq.gui.dialog; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.ResourceBundle; import java.util.UUID; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import megamek.common.util.EncodeControl; import mekhq.campaign.Campaign; import mekhq.campaign.finances.Asset; import mekhq.campaign.finances.Loan; import mekhq.campaign.parts.AmmoStorage; import mekhq.campaign.parts.Part; import mekhq.campaign.unit.Unit; /** * A dialog to decide how you want to pay off collateral when you * default on a loan * @author Taharqa */ public class PayCollateralDialog extends JDialog { /** * */ private static final long serialVersionUID = 6995319032267472795L; @SuppressWarnings("unused") // FIXME private Frame frame; private Campaign campaign; private boolean cancelled; private boolean paid; private Loan loan; private ArrayList<JCheckBox> unitBoxes; private ArrayList<JCheckBox> assetBoxes; private ArrayList<JSlider> partSliders; private JProgressBar barAmount; private JButton btnPay; private JButton btnDontPay; private JButton btnCancel; public PayCollateralDialog(java.awt.Frame parent, boolean modal, Campaign c, Loan l) { super(parent, modal); this.frame = parent; campaign = c; loan = l; cancelled = false; paid = false; initComponents(); setLocationRelativeTo(parent); } private void initComponents() { ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.PayCollateralDialog", new EncodeControl()); //$NON-NLS-1$ java.awt.GridBagConstraints gridBagConstraints; JTabbedPane panMain = new JTabbedPane(); JPanel panInfo = new JPanel(new GridLayout(1,0)); JPanel panBtn = new JPanel(new GridLayout(0,3)); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle(resourceMap.getString("Form.title")); getContentPane().setLayout(new BorderLayout()); barAmount = new JProgressBar(0, 100); barAmount.setValue(0); barAmount.setStringPainted(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.0; panInfo.add(barAmount, gridBagConstraints); unitBoxes = new ArrayList<JCheckBox>(); JCheckBox box; int i = 0; int j = 0; JPanel pnlUnits = new JPanel(new GridBagLayout()); for(Unit u : campaign.getUnits()) { j++; box = new JCheckBox(u.getName() + " (" + DecimalFormat.getInstance().format(u.getSellValue()) + "C-bills)"); box.setSelected(false); box.setEnabled(u.isPresent() && !u.isDeployed()); box.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent evt) { updateAmount(); } }); unitBoxes.add(box); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = i; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; if(j == (campaign.getUnits().size())) { gridBagConstraints.weighty = 1.0; } gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0); pnlUnits.add(box, gridBagConstraints); i++; } JScrollPane scrUnits = new JScrollPane(); scrUnits.setViewportView(pnlUnits); scrUnits.setMinimumSize(new java.awt.Dimension(400, 300)); scrUnits.setPreferredSize(new java.awt.Dimension(400, 300)); partSliders = new ArrayList<JSlider>(); JPanel pnlParts = new JPanel(new GridBagLayout()); i = 0; j = 0; JSlider partSlider; for(Part p : campaign.getSpareParts()) { j++; int quantity = p.getQuantity(); if(p instanceof AmmoStorage) { quantity = ((AmmoStorage)p).getQuantity(); } partSlider = new JSlider(JSlider.HORIZONTAL, 0, quantity, 0); //TODO: deal with armors partSlider.setMajorTickSpacing(1); if(quantity < 11) { partSlider.setPaintLabels(true); } partSlider.setPaintTicks(true); partSlider.setSnapToTicks(true); partSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { updateAmount(); } }); partSlider.setEnabled(p.isPresent() && !p.isReservedForRefit() && !p.isReservedForReplacement()); partSliders.add(partSlider); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = i; gridBagConstraints.gridwidth = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.fill = java.awt.GridBagConstraints.NONE; gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0); gridBagConstraints.weightx = 0.0; if(j == campaign.getSpareParts().size()) { gridBagConstraints.weighty = 1.0; } pnlParts.add(partSlider, gridBagConstraints); gridBagConstraints.gridx = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; pnlParts.add(new JLabel("<html>" + p.getName() + "<br>" + p.getDetails() + ", "+ DecimalFormat.getInstance().format(p.getCurrentValue()) + "</html>"), gridBagConstraints); i++; } JScrollPane scrParts = new JScrollPane(); scrParts.setViewportView(pnlParts); scrParts.setMinimumSize(new java.awt.Dimension(400, 300)); scrParts.setPreferredSize(new java.awt.Dimension(400, 300)); //TODO: use cash reserves btnPay = new JButton(resourceMap.getString("btnPay.text")); // NOI18N btnPay.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { payCollateral(); } }); btnPay.setEnabled(false); panBtn.add(btnPay); btnDontPay = new JButton(resourceMap.getString("btnDontPay.text")); // NOI18N btnDontPay.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { dontPayCollateral(); } }); panBtn.add(btnDontPay); btnCancel = new JButton(resourceMap.getString("btnCancel.text")); // NOI18N btnCancel.setName("btnCancel"); // NOI18N btnCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelled = true; setVisible(false); } }); panBtn.add(btnCancel); assetBoxes = new ArrayList<JCheckBox>(); i = 0; j = 0; JPanel pnlAssets = new JPanel(new GridBagLayout()); for(Asset a : campaign.getFinances().getAllAssets()) { j++; box = new JCheckBox(a.getName() + " (" + DecimalFormat.getInstance().format(a.getValue()) + "C-bills)"); box.setSelected(false); box.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent evt) { updateAmount(); } }); assetBoxes.add(box); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = i; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; if(j == (campaign.getFinances().getAllAssets().size())) { gridBagConstraints.weighty = 1.0; } gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0); pnlAssets.add(box, gridBagConstraints); i++; } JScrollPane scrAssets = new JScrollPane(pnlAssets); scrAssets.setMinimumSize(new java.awt.Dimension(400, 300)); scrAssets.setPreferredSize(new java.awt.Dimension(400, 300)); updateAmount(); panMain.add("Units", scrUnits); panMain.add("Parts", scrParts); panMain.add("Assets", scrAssets); getContentPane().add(panInfo, BorderLayout.PAGE_START); getContentPane().add(panMain, BorderLayout.CENTER); getContentPane().add(panBtn, BorderLayout.PAGE_END); pack(); } public boolean wasCancelled() { return cancelled; } public boolean wasPaid() { return paid; } public void payCollateral() { //TODO: summary and are you sure dialog paid = true; setVisible(false); } public void dontPayCollateral() { //TODO: are you sure dialog paid = false; setVisible(false); } private void updateAmount() { long amount = 0; for(int i = 0; i < unitBoxes.size(); i++) { JCheckBox box = unitBoxes.get(i); if(box.isSelected()) { amount += campaign.getUnits().get(i).getSellValue(); } } for(int i = 0; i < partSliders.size(); i++) { int quantity = partSliders.get(i).getValue(); if(quantity > 0) { amount += campaign.getSpareParts().get(i).getCurrentValue() * quantity; } } for(int i = 0; i < assetBoxes.size(); i++) { JCheckBox box = assetBoxes.get(i); if(box.isSelected()) { amount += campaign.getFinances().getAllAssets().get(i).getValue(); } } int percent = Math.round(100 * amount / loan.getCollateralAmount()); if(percent < 100) { btnPay.setEnabled(false); } else { btnPay.setEnabled(true); } barAmount.setValue(percent); barAmount.setString(DecimalFormat.getInstance().format(amount) + "/" + DecimalFormat.getInstance().format(loan.getCollateralAmount())); } public ArrayList<UUID> getUnits() { ArrayList<UUID> uid = new ArrayList<UUID>(); for(int i = 0; i < unitBoxes.size(); i++) { JCheckBox box = unitBoxes.get(i); if(box.isSelected()) { uid.add(campaign.getUnits().get(i).getId()); } } return uid; } public ArrayList<int[]> getParts() { ArrayList<int[]> parts = new ArrayList<int[]>(); for(int i = 0; i < partSliders.size(); i++) { int quantity = partSliders.get(i).getValue(); if(quantity > 0) { int[] array = {campaign.getSpareParts().get(i).getId(), quantity}; parts.add(array); } } return parts; } public ArrayList<Asset> getRemainingAssets() { ArrayList<Asset> newAssets = new ArrayList<Asset>(); for(int i = 0; i < assetBoxes.size(); i++) { JCheckBox box = assetBoxes.get(i); if(!box.isSelected()) { newAssets.add(campaign.getFinances().getAllAssets().get(i)); } } return newAssets; } }