private void MenuEditAddTeam_Click(object sender, EventArgs e) { log.Debug("EditorForm::MenuEditAddTeam_Click() {"); if (scoreboard == null) { log.Debug("EditorForm::MenuEditAddTeam_Click() } // scoreboard == null"); return; } AddTeamForm addTeamForm = new AddTeamForm(); addTeamForm.StartPosition = FormStartPosition.CenterParent; DialogResult result = addTeamForm.ShowDialog(this); if (result != DialogResult.OK) { log.Debug("EditorForm::MenuEditAddTeam_Click() } // cancelled"); return; } try { scoreboard.AddTeam(addTeamForm.TeamName); hasUnsavedChanges = true; } catch (ArgumentException ex) { log.Error("Failed add team.", ex); MessageBox.Show("Failed to add team: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); log.Debug("EditorForm::MenuEditAddTeam_Click() }"); return; } UpdateScores(); UpdateControls(); log.Debug("EditorForm::MenuEditAddTeam_Click() }"); }
public static Scoreboard LoadFromFile(Stream stream) { if (stream == null) { throw new ArgumentException("Failed to load scoreboard from file: Argument 'stream' is null."); } ScoreboardFile file; using (StreamReader reader = new StreamReader(stream)) { file = JsonConvert.DeserializeObject <ScoreboardFile>(reader.ReadToEnd()); } if (file.ExpectedNumberOfTeams < file.Teams.Length || file.Teams.Length != file.Scores.GetLength(0)) { throw new ArgumentException("Failed to load scoreboard from file: Invalid number of teams."); } if (file.ExpectedNumberOfCategories < file.Categories.Length || file.Categories.Length != file.Scores.GetLength(1)) { throw new ArgumentException("Failed to load scoreboard from file: Invalid number of categories."); } Scoreboard scoreboard = new Scoreboard(file.ExpectedNumberOfTeams, file.ExpectedNumberOfCategories); for (int i = 0; i < file.Teams.Length; ++i) { scoreboard.AddTeam(file.Teams[i]); } decimal[] scores = new decimal[file.Teams.Length]; for (int i = 0; i < file.Categories.Length; ++i) { for (int j = file.Teams.Length - 1; j >= 0; --j) { scores[j] = file.Scores[j, i]; } scoreboard.AddCategory(file.Categories[i], scores); } return(scoreboard); }
public static Scoreboard LoadFromFile(Stream stream) { if (stream == null) { throw new ArgumentException("Failed to load scoreboard from file: Argument 'stream' is null."); } using (TextReader reader = new StreamReader(stream)) { string buffer = reader.ReadToEnd(); string[][] rows = CsvParser.Parse(buffer, true, out string[] header); string[] dimens = header[0].Split('\\'); if (!int.TryParse(dimens[0], out int expectedNumberOfCategories)) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of categories in cell (0,0)."); } if (!int.TryParse(dimens[1], out int expectedNumberOfTeams)) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of teams in cell (0,0)."); } // first column contains category names if (header.Length > expectedNumberOfTeams + 1) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of columns in header."); } // header (row containing team names) is separate if (rows.Length > expectedNumberOfCategories) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid number of rows."); } for (int i = rows.Length - 1; i >= 0; --i) { if (rows[i].Length != header.Length) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid number columns in row " + (i + 1) + "."); } } Scoreboard scoreboard = new Scoreboard(expectedNumberOfTeams, expectedNumberOfCategories); for (int i = 1; i < header.Length; ++i) { scoreboard.AddTeam(header[i]); } decimal[] scores = new decimal[header.Length - 1]; for (int i = 0; i < rows.Length; ++i) { for (int j = header.Length - 2; j >= 0; --j) { if (!decimal.TryParse(rows[i][j + 1], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out scores[j])) { throw new ArgumentException("Failed to load scoreboard fom file: Invalid score for team '" + header[j + 1] + "' at category '" + rows[i][0] + "'."); } } scoreboard.AddCategory(rows[i][0], scores); } return(scoreboard); } }
private void MenuFileNewFromTemplate_Click(object sender, EventArgs e) { log.Debug("EditorForm::MenuFileNewFromTemplate_Click() {"); if (hasUnsavedChanges) { try { DialogResult result = MessageBox.Show("There are unsaved changes. Save?", "Information", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); switch (result) { case DialogResult.Yes: if (!SaveToFile()) { log.Debug("EditorForm::MenuFileNewFromTemplate_Click() } // cancelled (save existing)"); return; } break; case DialogResult.No: break; default: case DialogResult.Cancel: log.Debug("EditorForm::MenuFileNewFromTemplate_Click() } // cancelled (save existing)"); return; } } catch (Exception ex) { log.Error("Failed to import template: Failed to save existing scoreboard.", ex); MessageBox.Show("Failed to import template: Failed to save existing scoreboard: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); log.Debug("EditorForm::MenuFileNewFromTemplate_Click() }"); return; } } try { using (OpenFileDialog openFileDialog = new OpenFileDialog()) { openFileDialog.InitialDirectory = string.IsNullOrEmpty(fileName) ? Environment.SpecialFolder.MyDocuments.ToString() : fileName; openFileDialog.Filter = "CSV files (*.csv)|*.csv|JSON files (*.json)|*.json"; openFileDialog.FilterIndex = 1; openFileDialog.RestoreDirectory = true; Scoreboard template; if (openFileDialog.ShowDialog() == DialogResult.OK) { fileName = openFileDialog.FileName; switch (Path.GetExtension(fileName)) { case ".csv": template = CsvHandler.LoadFromFile(openFileDialog.OpenFile()); break; case ".json": template = JsonHandler.LoadFromFile(openFileDialog.OpenFile()); break; default: throw new ArgumentException("Unknown file format: '" + Path.GetExtension(fileName) + "'."); } hasUnsavedChanges = false; scoreboard = new Scoreboard(template.ExpectedNumberOfTeams, template.ExpectedNumberOfCategories); foreach (string team in template.Teams) { scoreboard.AddTeam(team); } NumericInputAnimationLength.Value = GetSuggestedAnimationLength(); UpdateScores(); UpdateControls(); } } } catch (Exception ex) { log.Error("Failed to import template.", ex); MessageBox.Show("Failed to import template: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } log.Debug("EditorForm::MenuFileNewFromTemplate_Click() }"); }