/*
* CustomizeScenarioDialog.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.Dimension;
import java.awt.Frame;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;
import megamek.common.util.EncodeControl;
import mekhq.campaign.Campaign;
import mekhq.campaign.mission.AtBScenario;
import mekhq.campaign.mission.Loot;
import mekhq.campaign.mission.Mission;
import mekhq.campaign.mission.Scenario;
import mekhq.gui.model.LootTableModel;
/**
*
* @author Taharqa
*/
public class CustomizeScenarioDialog extends javax.swing.JDialog {
private static final long serialVersionUID = -8038099101234445018L;
private Frame frame;
private Scenario scenario;
private Mission mission;
private Campaign campaign;
private boolean newScenario;
private Date date;
private SimpleDateFormat dateFormatter;
private LootTableModel lootModel;
private javax.swing.JButton btnAdd;
private javax.swing.JButton btnEdit;
private javax.swing.JButton btnDelete;
private ArrayList<Loot> loots;
private JTable lootTable;
private JPanel panLoot;
private javax.swing.JPanel panMain;
private javax.swing.JPanel panBtn;
private javax.swing.JButton btnClose;
private javax.swing.JButton btnOK;
private javax.swing.JLabel lblName;
private javax.swing.JTextField txtName;
private javax.swing.JTextArea txtDesc;
private javax.swing.JScrollPane scrDesc;
private javax.swing.JTextArea txtReport;
private javax.swing.JScrollPane scrReport;
private javax.swing.JComboBox<String> choiceStatus;
private javax.swing.JLabel lblStatus;
private javax.swing.JButton btnDate;
public CustomizeScenarioDialog(java.awt.Frame parent, boolean modal, Scenario s, Mission m, Campaign c) {
super(parent, modal);
this.frame = parent;
this.mission = m;
if(null == s) {
scenario = new Scenario("New Scenario");
newScenario = true;
} else {
scenario = s;
newScenario = false;
}
campaign = c;
date = scenario.getDate();
if(null == date) {
date = campaign.getCalendar().getTime();
}
dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
loots = new ArrayList<Loot>();
for(Loot loot : scenario.getLoot()) {
loots.add((Loot)loot.clone());
}
lootModel = new LootTableModel(loots);
initComponents();
setLocationRelativeTo(parent);
}
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
txtName = new javax.swing.JTextField();
txtDesc = new javax.swing.JTextArea();
txtReport = new javax.swing.JTextArea();
lblName = new javax.swing.JLabel();
btnOK = new javax.swing.JButton();
btnClose = new javax.swing.JButton();
scrDesc = new javax.swing.JScrollPane();
scrReport = new javax.swing.JScrollPane();
choiceStatus = new javax.swing.JComboBox<String>();
lblStatus = new javax.swing.JLabel();
panMain = new javax.swing.JPanel();
panBtn = new javax.swing.JPanel();
ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.CustomizeScenarioDialog", new EncodeControl()); //$NON-NLS-1$
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setName("Form"); // NOI18N
setTitle(resourceMap.getString("title.new"));
getContentPane().setLayout(new BorderLayout());
panMain.setLayout(new GridBagLayout());
panBtn.setLayout(new GridLayout(0,2));
lblName.setText(resourceMap.getString("lblName.text")); // NOI18N
lblName.setName("lblName"); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
panMain.add(lblName, gridBagConstraints);
txtName.setText(scenario.getName());
txtName.setName("txtName"); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
panMain.add(txtName, gridBagConstraints);
if(!scenario.isCurrent()) {
lblStatus.setText(resourceMap.getString("lblStatus.text"));
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy++;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panMain.add(lblStatus, gridBagConstraints);
DefaultComboBoxModel<String> statusModel = new DefaultComboBoxModel<String>();
for (int i = 1; i < Scenario.S_NUM; i++) {
statusModel.addElement(Scenario.getStatusName(i));
}
choiceStatus.setModel(statusModel);
choiceStatus.setName("choiceStatus"); // NOI18N
choiceStatus.setSelectedIndex(scenario.getStatus()-1);
gridBagConstraints.gridx = 1;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panMain.add(choiceStatus, gridBagConstraints);
}
if (!scenario.isCurrent() || (campaign.getCampaignOptions().getUseAtB() && scenario instanceof AtBScenario)) {
btnDate = new javax.swing.JButton();
btnDate.setText(dateFormatter.format(date));
btnDate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
changeDate();
}
});
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy++;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 0.0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panMain.add(btnDate, gridBagConstraints);
}
if (scenario.isCurrent()) {
initLootPanel();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy++;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
panLoot.setPreferredSize(new Dimension(400,150));
panLoot.setMinimumSize(new Dimension(400,150));
panLoot.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Potential Rewards"),
BorderFactory.createEmptyBorder(5,5,5,5)));
panMain.add(panLoot, gridBagConstraints);
}
txtDesc.setText(scenario.getDescription());
txtDesc.setName("txtDesc");
txtDesc.setEditable(true);
txtDesc.setLineWrap(true);
txtDesc.setWrapStyleWord(true);
txtDesc.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Description"),
BorderFactory.createEmptyBorder(5,5,5,5)));
scrDesc.setViewportView(txtDesc);
scrDesc.setPreferredSize(new Dimension(400,200));
scrDesc.setMinimumSize(new Dimension(400,200));
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy++;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panMain.add(scrDesc, gridBagConstraints);
if(!scenario.isCurrent()) {
txtReport.setText(scenario.getReport());
txtReport.setName("txtReport");
txtReport.setEditable(true);
txtReport.setLineWrap(true);
txtReport.setWrapStyleWord(true);
txtReport.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("After-Action Report"),
BorderFactory.createEmptyBorder(5,5,5,5)));
scrReport.setViewportView(txtReport);
scrReport.setPreferredSize(new Dimension(400,200));
scrReport.setMinimumSize(new Dimension(400,200));
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy++;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panMain.add(scrReport, gridBagConstraints);
}
btnOK.setText(resourceMap.getString("btnOkay.text")); // NOI18N
btnOK.setName("btnOK"); // NOI18N
btnOK.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnOKActionPerformed(evt);
}
});
panBtn.add(btnOK);
btnClose.setText(resourceMap.getString("btnCancel.text")); // NOI18N
btnClose.setName("btnClose"); // NOI18N
btnClose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCloseActionPerformed(evt);
}
});
gridBagConstraints.gridx = 1;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.CENTER;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0);
panBtn.add(btnClose);
getContentPane().add(panMain, BorderLayout.CENTER);
getContentPane().add(panBtn, BorderLayout.PAGE_END);
pack();
}
private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnHireActionPerformed
scenario.setName(txtName.getText());
scenario.setDesc(txtDesc.getText());
if(!scenario.isCurrent() || (campaign.getCampaignOptions().getUseAtB() && scenario instanceof AtBScenario)) {
scenario.setReport(txtReport.getText());
scenario.setStatus(choiceStatus.getSelectedIndex()+1);
scenario.setDate(date);
}
scenario.resetLoot();
for(Loot loot : lootModel.getAllLoot()) {
scenario.addLoot(loot);
}
if(newScenario) {
campaign.addScenario(scenario, mission);
}
this.setVisible(false);
}
public int getMissionId() {
return mission.getId();
}
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed
this.setVisible(false);
}
private void changeDate() {
// show the date chooser
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
DateChooser dc = new DateChooser(frame, cal);
// user can eiter choose a date or cancel by closing
if (dc.showDateChooser() == DateChooser.OK_OPTION) {
if (scenario.isCurrent()) {
if (dc.getDate().getTime().before(campaign.getCalendar().getTime())) {
JOptionPane.showMessageDialog(frame,
"You cannot choose a date before the current date for a pending battle.",
"Invalid date",
JOptionPane.ERROR_MESSAGE);
return;
} else {
//Calendar math necessitated by variations in locales
GregorianCalendar nextMonday = new GregorianCalendar();
nextMonday.setTime(campaign.getDate());
nextMonday.add(Calendar.DAY_OF_MONTH, 1);
while (nextMonday.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
nextMonday.add(Calendar.DAY_OF_MONTH, 1);
}
//
if (!dc.getDate().getTime().before(nextMonday.getTime())) {
JOptionPane.showMessageDialog(frame,
"You cannot choose a date beyond the current week.",
"Invalid date",
JOptionPane.ERROR_MESSAGE);
return;
}
}
} else if (dc.getDate().getTime().after(campaign.getCalendar().getTime())) {
JOptionPane.showMessageDialog(frame,
"You cannot choose a date after the current date.",
"Invalid date",
JOptionPane.ERROR_MESSAGE);
return;
}
date = dc.getDate().getTime();
btnDate.setText(dateFormatter.format(date));
}
}
private void initLootPanel() {
panLoot = new JPanel(new BorderLayout());
JPanel panBtns = new JPanel(new GridLayout(1,0));
btnAdd = new JButton("Add Loot"); // NOI18N
btnAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addLoot();
}
});
panBtns.add(btnAdd);
btnEdit = new JButton("Edit Loot"); // NOI18N
btnEdit.setEnabled(false);
btnEdit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editLoot();
}
});
panBtns.add(btnEdit);
btnDelete = new JButton("Delete Loot"); // NOI18N
btnDelete.setEnabled(false);
btnDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteLoot();
}
});
panBtns.add(btnDelete);
panLoot.add(panBtns, BorderLayout.PAGE_START);
lootTable = new JTable(lootModel);
TableColumn column = null;
for (int i = 0; i < LootTableModel.N_COL; i++) {
column = lootTable.getColumnModel().getColumn(i);
column.setPreferredWidth(lootModel.getColumnWidth(i));
column.setCellRenderer(lootModel.getRenderer());
}
lootTable.setIntercellSpacing(new Dimension(0, 0));
lootTable.setShowGrid(false);
lootTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lootTable.getSelectionModel().addListSelectionListener(
new javax.swing.event.ListSelectionListener() {
public void valueChanged(
javax.swing.event.ListSelectionEvent evt) {
lootTableValueChanged(evt);
}
});
panLoot.add(new JScrollPane(lootTable), BorderLayout.CENTER);
}
private void lootTableValueChanged(javax.swing.event.ListSelectionEvent evt) {
int row = lootTable.getSelectedRow();
btnDelete.setEnabled(row != -1);
btnEdit.setEnabled(row != -1);
}
private void addLoot() {
LootDialog ekld = new LootDialog(frame, true, new Loot(), campaign);
ekld.setVisible(true);
if(null != ekld.getLoot()) {
lootModel.addLoot(ekld.getLoot());
}
refreshTable();
}
private void editLoot() {
Loot loot = lootModel.getLootAt(lootTable.getSelectedRow());
if(null != loot) {
LootDialog ekld = new LootDialog(frame, true, loot, campaign);
ekld.setVisible(true);
refreshTable();
}
}
private void deleteLoot() {
int row = lootTable.getSelectedRow();
if(-1 != row) {
loots.remove(row);
}
refreshTable();
}
private void refreshTable() {
int selectedRow = lootTable.getSelectedRow();
lootModel.setData(loots);
if(selectedRow != -1) {
if(lootTable.getRowCount() > 0) {
if(lootTable.getRowCount() == selectedRow) {
lootTable.setRowSelectionInterval(selectedRow-1, selectedRow-1);
} else {
lootTable.setRowSelectionInterval(selectedRow, selectedRow);
}
}
}
}
}