/* * Copyright (c) 2017 The MegaMek Team. 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; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.TableColumn; import megamek.common.event.Subscribe; import mekhq.MekHQ; import mekhq.campaign.event.AcquisitionEvent; import mekhq.campaign.event.AssetEvent; import mekhq.campaign.event.GMModeEvent; import mekhq.campaign.event.LoanEvent; import mekhq.campaign.event.MissionChangedEvent; import mekhq.campaign.event.MissionNewEvent; import mekhq.campaign.event.PartEvent; import mekhq.campaign.event.ScenarioResolvedEvent; import mekhq.campaign.event.TransactionEvent; import mekhq.campaign.event.UnitEvent; import mekhq.campaign.mission.Contract; import mekhq.gui.adapter.FinanceTableMouseAdapter; import mekhq.gui.adapter.LoanTableMouseAdapter; import mekhq.gui.dialog.AddFundsDialog; import mekhq.gui.dialog.ManageAssetsDialog; import mekhq.gui.dialog.NewLoanDialog; import mekhq.gui.model.FinanceTableModel; import mekhq.gui.model.LoanTableModel; /** * Shows record of financial transactions. */ public final class FinancesTab extends CampaignGuiTab { private static final long serialVersionUID = -3203920871646865885L; private JTable financeTable; private JTable loanTable; private JTextArea areaNetWorth; private JButton btnAddFunds; private JButton btnManageAssets; private FinanceTableModel financeModel; private LoanTableModel loanModel; FinancesTab(CampaignGUI gui, String name) { super(gui, name); MekHQ.registerHandler(this); } /* * (non-Javadoc) * * @see mekhq.gui.CampaignGuiTab#initTab() */ @Override public void initTab() { GridBagConstraints gridBagConstraints; setLayout(new GridBagLayout()); financeModel = new FinanceTableModel(); financeTable = new JTable(financeModel); financeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); financeTable.addMouseListener(new FinanceTableMouseAdapter(getCampaignGui(), financeTable, financeModel)); financeTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); TableColumn column = null; for (int i = 0; i < FinanceTableModel.N_COL; i++) { column = financeTable.getColumnModel().getColumn(i); column.setPreferredWidth(financeModel.getColumnWidth(i)); column.setCellRenderer(financeModel.getRenderer()); } financeTable.setIntercellSpacing(new Dimension(0, 0)); financeTable.setShowGrid(false); loanModel = new LoanTableModel(); loanTable = new JTable(loanModel); loanTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); loanTable.addMouseListener(new LoanTableMouseAdapter(getCampaignGui(), loanTable, loanModel)); loanTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); column = null; for (int i = 0; i < LoanTableModel.N_COL; i++) { column = loanTable.getColumnModel().getColumn(i); column.setPreferredWidth(loanModel.getColumnWidth(i)); column.setCellRenderer(loanModel.getRenderer()); } loanTable.setIntercellSpacing(new Dimension(0, 0)); loanTable.setShowGrid(false); JScrollPane scrollLoanTable = new JScrollPane(loanTable); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; JPanel panBalance = new JPanel(new GridBagLayout()); panBalance.add(new JScrollPane(financeTable), gridBagConstraints); panBalance.setBorder(BorderFactory.createTitledBorder("Balance Sheet")); JPanel panLoan = new JPanel(new GridBagLayout()); panLoan.add(scrollLoanTable, gridBagConstraints); scrollLoanTable.setMinimumSize(new java.awt.Dimension(450, 150)); scrollLoanTable.setPreferredSize(new java.awt.Dimension(450, 150)); panLoan.setBorder(BorderFactory.createTitledBorder("Active Loans")); // JSplitPane splitFinances = new // JSplitPane(JSplitPane.VERTICAL_SPLIT,panBalance, panLoan); // splitFinances.setOneTouchExpandable(true); // splitFinances.setResizeWeight(1.0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(panBalance, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.0; add(panLoan, gridBagConstraints); JPanel panelFinanceRight = new JPanel(new BorderLayout()); JPanel pnlFinanceBtns = new JPanel(new GridLayout(2, 2)); btnAddFunds = new JButton("Add Funds (GM)"); btnAddFunds.addActionListener(ev -> addFundsActionPerformed()); btnAddFunds.setEnabled(getCampaign().isGM()); pnlFinanceBtns.add(btnAddFunds); JButton btnGetLoan = new JButton("Get Loan"); btnGetLoan.addActionListener(e -> showNewLoanDialog()); pnlFinanceBtns.add(btnGetLoan); btnManageAssets = new JButton("Manage Assets (GM)"); btnManageAssets.addActionListener(e -> manageAssets()); btnManageAssets.setEnabled(getCampaign().isGM()); pnlFinanceBtns.add(btnManageAssets); panelFinanceRight.add(pnlFinanceBtns, BorderLayout.NORTH); areaNetWorth = new JTextArea(); areaNetWorth.setLineWrap(true); areaNetWorth.setWrapStyleWord(true); areaNetWorth.setFont(new Font("Courier New", Font.PLAIN, 12)); areaNetWorth.setText(getCampaign().getFinancialReport()); areaNetWorth.setEditable(false); JScrollPane descriptionScroll = new JScrollPane(areaNetWorth); panelFinanceRight.add(descriptionScroll, BorderLayout.CENTER); areaNetWorth.setCaretPosition(0); descriptionScroll.setMinimumSize(new Dimension(300, 200)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 0.0; gridBagConstraints.weighty = 1.0; add(panelFinanceRight, gridBagConstraints); } /* * (non-Javadoc) * * @see mekhq.gui.CampaignGuiTab#refreshAll() */ @Override public void refreshAll() { refreshFinancialTransactions(); } /* * (non-Javadoc) * * @see mekhq.gui.CampaignGuiTab#tabType() */ @Override public GuiTabType tabType() { return GuiTabType.FINANCES; } private void addFundsActionPerformed() { AddFundsDialog addFundsDialog = new AddFundsDialog(getFrame(), true); addFundsDialog.setVisible(true); if (addFundsDialog.getClosedType() == JOptionPane.OK_OPTION) { long funds = addFundsDialog.getFundsQuantity(); String description = addFundsDialog.getFundsDescription(); int category = addFundsDialog.getCategory(); getCampaign().addFunds(funds, description, category); } } private void showNewLoanDialog() { NewLoanDialog nld = new NewLoanDialog(getFrame(), true, getCampaign()); nld.setVisible(true); } private void manageAssets() { ManageAssetsDialog mad = new ManageAssetsDialog(getFrame(), getCampaign()); mad.setVisible(true); } public void refreshFinancialTransactions() { SwingUtilities.invokeLater(() -> { financeModel.setData(getCampaign().getFinances().getAllTransactions()); loanModel.setData(getCampaign().getFinances().getAllLoans()); refreshFinancialReport(); }); } public void refreshFinancialReport() { SwingUtilities.invokeLater(() -> { areaNetWorth.setText(getCampaign().getFinancialReport()); areaNetWorth.setCaretPosition(0); }); } ActionScheduler financialTransactionsScheduler = new ActionScheduler(this::refreshFinancialTransactions); ActionScheduler financialReportScheduler = new ActionScheduler(this::refreshFinancialReport); @Subscribe public void handle(GMModeEvent ev) { btnAddFunds.setEnabled(ev.isGMMode()); btnManageAssets.setEnabled(ev.isGMMode()); } @Subscribe public void handle(ScenarioResolvedEvent ev) { financialTransactionsScheduler.schedule(); } @Subscribe public void handle(MissionNewEvent ev) { if (ev.getMission() instanceof Contract) { financialReportScheduler.schedule(); } } @Subscribe public void handle(MissionChangedEvent ev) { if (ev.getMission() instanceof Contract) { financialReportScheduler.schedule(); } } @Subscribe public void handle(AcquisitionEvent ev) { financialTransactionsScheduler.schedule(); } @Subscribe public void handle(TransactionEvent ev) { financialTransactionsScheduler.schedule(); } @Subscribe public void handle(LoanEvent ev) { financialTransactionsScheduler.schedule(); } @Subscribe public void handle(UnitEvent ev) { financialReportScheduler.schedule(); } @Subscribe public void handle(PartEvent ev) { financialReportScheduler.schedule(); } @Subscribe public void handle(AssetEvent ev) { financialReportScheduler.schedule(); } }