Files
Melissa Avery-Weir 3831a7c5ce Fix improper datasource binding refreshes
Switch to a BindingList and use extension methods to have Sort and
AddRange.
2013-12-06 11:07:40 -05:00

361 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using d20_SRD_Spell_Lists.Models;
using d20_SRD_Spell_Lists.Exceptions;
using System.Xml.Serialization;
using System.IO;
using Printing.DataGridViewPrint.Tools;
using System.Reflection;
using System.Collections.ObjectModel;
namespace d20_SRD_Spell_Lists {
public partial class FrmMain : Form {
private MasterSpellSet spells;
private Character character;
private string characterFile;
private bool loadingCharacter;
private bool dirtyCharacter;
private PrintingDataGridViewProvider printProvider;
public FrmMain() {
InitializeComponent();
this.Text = AssemblyTitle;
character = new Character();
spells = new MasterSpellSet();
spellsDataGridView.AutoGenerateColumns = false;
loadingCharacter = false;
dirtyCharacter = false;
setupAttributes();
setupClassList();
setupSpells();
//spellsDataGridView.CellValueChanged += new DataGridViewCellEventHandler(spellsDataGridView_CellValueChanged);
}
private void setupPrinting() {
printDoc = new System.Drawing.Printing.PrintDocument();
printDoc.DocumentName = "D20 3.5 SRD Spell List";
printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(40, 40, 40, 20);
printDoc.DefaultPageSettings.Landscape = true;
printProvider = PrintingDataGridViewProvider.Create(printDoc, spellsDataGridView, true, true, true,
new TitlePrintBlock() {
Title = printDoc.DocumentName,
DCs = this.tableLayoutPanel1,
CharName = character.Name,
CharClass = Character.getSpellcastingClassName(character.CharacterClass),
CharAttr = character.SpellCastingAttribute.ToString(),
CharAttrMod = character.SpellCastingAttributeModAsString(),
CharAttrName = character.SpellCastingAttributeName
},
new HeaderPrintBlock() {
Header = character.Name
},
new FooterPrintBlock() {
Footer = "Page XX of YY"
});
}
private void setupSpells() {
this.spellsDataGridView.DataSource = character.Spells;
}
private void setupAttributes() {
txtSpellCastingAttribute.LostFocus += new EventHandler(txtSpellCastingAttribute_LostFocus);
txtSpellCastingAttribute_TextChanged(txtSpellCastingAttribute, new EventArgs());
}
private void setupClassList() {
List<string> classOptions = new List<string>();
classOptions.Add("Choose a class...");
classOptions.AddRange(Character.ClassNames);
charClassComboBox.DataSource = classOptions;
charClassComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
charClassComboBox.SelectedIndexChanged += new System.EventHandler(charClassComboBox_SelectedIndexChanged);
}
private void charClassComboBox_SelectedIndexChanged(object sender, EventArgs e) {
ComboBox classList = (ComboBox)sender;
if (classList.SelectedItem.ToString() != "Choose a class...") {
updateClassInformation(classList);
updateSpellDCs();
updateExtraSpells();
if (!loadingCharacter) {
offerNewSpells();
}
}
dirtyCharacter = true;
}
private void offerNewSpells() {
string question = "Would you like to add all base " + character.CharacterClass.ToString() + " spells to the list?";
string title = "Add all spells?";
var result = MessageBox.Show(question, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if (result == System.Windows.Forms.DialogResult.Yes) {
character.addAllClassSpells();
}
}
private void updateClassInformation(ComboBox classList) {
string charClass = classList.SelectedItem.ToString();
character.CharacterClass = (Character.SpellCastingClasses)Enum.Parse(typeof(Character.SpellCastingClasses), charClass);
lblSpellCastingAttribute.Text = character.SpellCastingAttributeName + ":";
}
private void updateExtraSpells() {
for (int i = 0; i < character.BonusSpells.Length; i++) {
if (character.BonusSpells[i] >= 0) {
((Label)this.Controls.Find("lblExtra" + i, true)[0]).Text = character.BonusSpells[i].ToString();
} else {
((Label)this.Controls.Find("lblExtra" + i, true)[0]).Text = "\u2014";
}
}
}
private void updateSpellDCs() {
for (int i = 0; i < 10; i++) {
((Label)this.Controls.Find("lblDC" + i, true)[0]).Text = (10 + i + character.SpellCastingAttributeMod).ToString();
}
}
private void txtSpellCastingAttribute_TextChanged(object sender, EventArgs e) {
if (txtSpellCastingAttribute.Text != "") {
character.SpellCastingAttribute = int.Parse(txtSpellCastingAttribute.Text);
lblSpellCastingAttributeMod.Text = character.SpellCastingAttributeModAsString();
}
}
private void txtSpellCastingAttribute_LostFocus(object sender, EventArgs e) {
updateSpellDCs();
updateExtraSpells();
}
private void saveToolStripButton_Click(object sender, EventArgs e) {
if (characterFile != null && characterFile != "") {
try {
saveCharacter();
} catch (IOException) {
getFilenameFromUserAndSave();
}
} else {
getFilenameFromUserAndSave();
}
}
private void getFilenameFromUserAndSave() {
SaveFileDialog sfd = new SaveFileDialog();
sfd.AddExtension = true;
sfd.Filter = "Character files (*.xml)|*.xml|All files (*.*)|*.*";
sfd.FilterIndex = 1;
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK) {
this.characterFile = sfd.FileName;
saveCharacter();
}
}
private void saveCharacter() {
XmlSerializer serializer = new XmlSerializer(typeof(Character));
using (TextWriter writer = new StreamWriter(characterFile)) {
serializer.Serialize(writer, character);
dirtyCharacter = false;
}
}
private void txtCharacter_TextChanged(object sender, EventArgs e) {
character.Name = txtCharacter.Text;
dirtyCharacter = true;
}
private bool promptSaveAndContinue() {
if (dirtyCharacter) {
string msg = "Do you want to save your current character?";
string title = "Save?";
var result = MessageBox.Show(msg, title, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (result == System.Windows.Forms.DialogResult.Yes) {
saveToolStripButton.PerformClick();
return true;
} else if (result == System.Windows.Forms.DialogResult.Cancel) {
return false;
}
}
return true;
}
private void openToolStripButton_Click(object sender, EventArgs e) {
if (promptSaveAndContinue()) {
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Character files (*.xml)|*.xml|All files (*.*)|*.*";
ofd.FilterIndex = 1;
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK) {
try {
characterFile = ofd.FileName;
loadingCharacter = true;
loadCharacter();
loadValues();
} catch (Exception ex) {
MessageBox.Show("Error: Could not read the character file. Original error: " + ex.Message);
} finally {
loadingCharacter = false;
dirtyCharacter = false;
}
}
}
}
private void loadCharacter() {
XmlSerializer serializer = new XmlSerializer(typeof(Character));
using (FileStream f = new FileStream(characterFile, FileMode.Open)) {
character = (Character)serializer.Deserialize(f);
}
}
private void loadValues() {
txtCharacter.Text = character.Name;
txtSpellCastingAttribute.Text = character.SpellCastingAttribute.ToString();
charClassComboBox.SelectedItem = Character.getSpellcastingClassName(character.CharacterClass);
}
private void btnAdd_Click(object sender, EventArgs e) {
FrmAddEdit addForm = new FrmAddEdit(false, character);
var result = addForm.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK) {
character.Spells.Add(addForm.spell);
character.Spells.Sort(new SpellInequalityComparer());
dirtyCharacter = true;
}
}
private void spellsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) {
if (isEditButtonCell(e)) {
Spell editItem = (Spell)spellsDataGridView.Rows[e.RowIndex].DataBoundItem;
FrmAddEdit editForm = new FrmAddEdit(true, character, editItem);
var result = editForm.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK) {
character.Spells[character.Spells.IndexOf(editItem)] = editForm.spell;
dirtyCharacter = true;
}
} else if (isDeleteButtonCell(e)) {
Spell deleteItem = (Spell)spellsDataGridView.Rows[e.RowIndex].DataBoundItem;
string msg = "Are you sure you want to delete this spell from your character?";
string title = "Confirm";
var result = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == System.Windows.Forms.DialogResult.Yes) {
character.Spells.Remove(deleteItem);
dirtyCharacter = true;
}
}
}
private bool isDeleteButtonCell(DataGridViewCellEventArgs e) {
if (spellsDataGridView.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 6) {
return true;
}
return false;
}
private bool isEditButtonCell(DataGridViewCellEventArgs e) {
if (spellsDataGridView.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 5) {
return true;
}
return false;
}
private void helpToolStripButton_Click(object sender, EventArgs e) {
FrmCredits credits = new FrmCredits();
credits.ShowDialog();
}
private void printToolStripButton_Click(object sender, EventArgs e) {
spellsDataGridView.Columns["editColumn"].Visible = false;
spellsDataGridView.Columns["deleteColumn"].Visible = false;
setupPrinting();
PrintDialog pd = new PrintDialog();
pd.Document = printDoc;
pd.ShowDialog();
spellsDataGridView.Columns["editColumn"].Visible = true;
spellsDataGridView.Columns["deleteColumn"].Visible = true;
}
private void printPreviewToolstripButton_Click(object sender, EventArgs e) {
spellsDataGridView.Columns["editColumn"].Visible = false;
spellsDataGridView.Columns["deleteColumn"].Visible = false;
setupPrinting();
PrintPreviewDialog ppd = new PrintPreviewDialog();
ppd.Document = printDoc;
ppd.ShowDialog();
spellsDataGridView.Columns["editColumn"].Visible = true;
spellsDataGridView.Columns["deleteColumn"].Visible = true;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
switch (keyData) {
case (Keys.Control | Keys.O):
openToolStripButton.PerformClick();
return true;
case (Keys.Control | Keys.S):
saveToolStripButton.PerformClick();
return true;
case (Keys.Control | Keys.N):
newToolStripButton.PerformClick();
return true;
case (Keys.Control | Keys.P):
printToolStripButton.PerformClick();
return true;
case (Keys.Control | Keys.H):
helpToolStripButton.PerformClick();
return true;
default:
return base.ProcessCmdKey(ref msg, keyData);
}
}
private void newToolStripButton_Click(object sender, EventArgs e) {
if (promptSaveAndContinue()) {
loadingCharacter = true;
character = new Character();
character.SpellCastingAttribute = 10;
loadValues();
charClassComboBox.SelectedIndex = 0;
dirtyCharacter = false;
loadingCharacter = false;
}
}
private void FrmMain_Closing(object sender, CancelEventArgs e) {
if (sender != this || !promptSaveAndContinue()) {
e.Cancel = true;
}
}
public string AssemblyTitle {
get {
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
if (attributes.Length > 0) {
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
if (titleAttribute.Title != "") {
return titleAttribute.Title;
}
}
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
}
}
}
}