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 System.IO; namespace Analizator9000 { /// /// Main application window control. /// public partial class Form1 : Form { /// /// Dealer input scripts parser instance. /// private DealerParser parser; /// /// Constructs the main window. /// public Form1() { InitializeComponent(); this.parser = new DealerParser(); } /// /// "Select file" button click, opens file selection dialog for input script. /// /// /// private void button1_Click(object sender, EventArgs e) { generateFileDialog.ShowDialog(); } /// /// Input script file selection event. Initiates input script parsing. /// /// /// private void openFileDialog1_FileOk(object sender, CancelEventArgs e) { try { this.parser = new DealerParser(); parser.loadFile(generateFileDialog.FileName); if (parser.produce > 0) produceBox.Text = parser.produce.ToString(); if (parser.generate > 0) generateBox.Text = parser.generate.ToString(); conditionBox.Text = parser.condition; if (parser.predeal.ContainsKey("east")) { predealEastSpadesBox.Text = parser.predeal["east"][0]; predealEastHeartsBox.Text = parser.predeal["east"][1]; predealEastDiamondsBox.Text = parser.predeal["east"][2]; predealEastClubsBox.Text = parser.predeal["east"][3]; } if (parser.predeal.ContainsKey("west")) { predealWestSpadesBox.Text = parser.predeal["west"][0]; predealWestHeartsBox.Text = parser.predeal["west"][1]; predealWestDiamondsBox.Text = parser.predeal["west"][2]; predealWestClubsBox.Text = parser.predeal["west"][3]; } if (parser.predeal.ContainsKey("north")) { predealNorthSpadesBox.Text = parser.predeal["north"][0]; predealNorthHeartsBox.Text = parser.predeal["north"][1]; predealNorthDiamondsBox.Text = parser.predeal["north"][2]; predealNorthClubsBox.Text = parser.predeal["north"][3]; } if (parser.predeal.ContainsKey("south")) { predealSouthSpadesBox.Text = parser.predeal["south"][0]; predealSouthHeartsBox.Text = parser.predeal["south"][1]; predealSouthDiamondsBox.Text = parser.predeal["south"][2]; predealSouthClubsBox.Text = parser.predeal["south"][3]; } foreach (String action in parser.actions) { actionsBox.Text += action.Substring("average".Length) + "\n"; } generateFileNameTextBox.Text = generateFileDialog.FileName; } catch (Exception ex) { MessageBox.Show("Błąd wczytywania pliku: " + ex.Message, "Błąd wczytywania pliku", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// "Generate" button click. Saves the input script file and runs deals generating. /// /// /// private void generateButton_Click(object sender, EventArgs e) { generateGroup.Enabled = false; analyzeGroup.Enabled = false; statusListBox.Items.Clear(); progressBar.Value = 0; resultTextBox.Text = ""; try { this.parser.generate = Convert.ToInt64(generateBox.Text); this.parser.produce = Convert.ToInt64(produceBox.Text); parser.condition = conditionBox.Text; parser.predeal["north"] = new String[] { predealNorthSpadesBox.Text, predealNorthHeartsBox.Text, predealNorthDiamondsBox.Text, predealNorthClubsBox.Text }; parser.predeal["south"] = new String[] { predealSouthSpadesBox.Text, predealSouthHeartsBox.Text, predealSouthDiamondsBox.Text, predealSouthClubsBox.Text }; parser.predeal["west"] = new String[] { predealWestSpadesBox.Text, predealWestHeartsBox.Text, predealWestDiamondsBox.Text, predealWestClubsBox.Text }; parser.predeal["east"] = new String[] { predealEastSpadesBox.Text, predealEastHeartsBox.Text, predealEastDiamondsBox.Text, predealEastClubsBox.Text }; foreach (KeyValuePair predeal in parser.predeal) { for (int i = 0; i < predeal.Value.Length; i++) { predeal.Value[i] = predeal.Value[i].ToUpper().Replace('D', 'Q').Replace('W', 'J').Replace("10", "T"); } } parser.actions = actionsBox.Text.Split('\n').ToList(); } catch (Exception ex) { MessageBox.Show("Błąd wprowadzania danych: " + ex.Message, "Błąd wprowadzania danych", MessageBoxButtons.OK, MessageBoxIcon.Error); generateGroup.Enabled = true; analyzeGroup.Enabled = true; } try { String outputFileName = parser.saveFile(); DealerWrapper dealer = new DealerWrapper("files/" + outputFileName, this, this.parser.produce); dealer.run(this.generateEnd); } catch (FileNotFoundException) { MessageBox.Show("Nie można utworzyć pliku. Sprawdź, czy w katalogu programu istnieje katalog 'files'", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); generateGroup.Enabled = true; analyzeGroup.Enabled = true; } catch (Exception ex) { MessageBox.Show("Błąd generatora: " + ex.Message, "Błąd generatora", MessageBoxButtons.OK, MessageBoxIcon.Error); generateGroup.Enabled = true; analyzeGroup.Enabled = true; } } /// /// Delegate for generating end method callback. /// /// private delegate void endDelegate(String filename); /// /// Generating end callback method. Prints out deal generating summary. /// /// Output (generated deals) file name. private void generateEnd(String filename) { if (this.InvokeRequired) { this.Invoke(new endDelegate(generateEnd), new object[] { filename }); } else { progressBar.Value = 100; if (filename != null) { this.addStatusLine("Zapisano do pliku: " + filename); } analyzeFileNameTextBox.Text = Path.GetFullPath(@"files\" + filename); generateGroup.Enabled = true; analyzeGroup.Enabled = true; } } /// /// Delegate for debug line addition method. /// /// private delegate void AddStatusDelegate(String line); /// /// Debug line addition method (thread-safe). /// /// String to be appended to the debug output. public void addStatusLine(String line) { if (line != null) { if (statusListBox.InvokeRequired) { this.Invoke(new AddStatusDelegate(addStatusLine), new object[] { line }); } else { statusListBox.Items.Add(line); statusListBox.SelectedIndex = statusListBox.Items.Count - 1; } } } /// /// Delegate for progress bar update method. /// /// Percentage of progress to set (0-100) private delegate void SetProgressDelegate(int progress); /// /// Progress bar update method (thread-safe). /// /// Percentage of progress to set (0-100) public void setProgress(int progress) { if (progressBar.InvokeRequired) { this.Invoke(new SetProgressDelegate(setProgress), new object[]{ progress }); } else { progressBar.Value = progress; } } /// /// Deals file selection event. Sets the deals file path in the text field. /// /// /// private void analyzeFileDialog_FileOk(object sender, CancelEventArgs e) { analyzeFileNameTextBox.Text = analyzeFileDialog.FileName; } /// /// "Select file" button click for deals file selection. /// /// /// private void button2_Click(object sender, EventArgs e) { analyzeFileDialog.ShowDialog(); } /// /// Instance of analysis summary class. /// private Accumulator ac; /// /// "Analyze" button click. Runs the analysis. /// /// /// private void analyzeButton_Click(object sender, EventArgs e) { analyzeGroup.Enabled = false; generateGroup.Enabled = false; abortButton.Enabled = true; statusListBox.Items.Clear(); this.addStatusLine("Otwieram plik: " + analyzeFileNameTextBox.Text); try { String[] deals = File.ReadAllLines(analyzeFileNameTextBox.Text); if (deals.Length == 0) { throw new Exception("Plik nie zawiera żadnych rozdań"); } List cons = new List(); foreach (int i in Enumerable.Range(1, 5)) { foreach (int j in Enumerable.Range(1, 4)) { if (((CheckBox)contractTable.GetControlFromPosition(i, j)).Checked) { cons.Add(new Contract(5 - i, j - 1)); } } } if (cons.Count == 0) { throw new Exception("Nie podano kontraktów"); } this.ac = new Accumulator(deals, cons, this); this.ac.run(10); } catch (Exception ex) { MessageBox.Show("Błąd analizy: " + ex.Message, "Błąd analizy", MessageBoxButtons.OK, MessageBoxIcon.Error); this.setProgress(0); abortButton.Enabled = false; analyzeGroup.Enabled = true; generateGroup.Enabled = true; } } /// /// Delegate for analysis end callback method. /// private delegate void EndAnalysisDelegate(); /// /// Analysis end callback method. Cleans up visually after the analysis. /// public void endAnalysis() { if (this.InvokeRequired) { this.Invoke(new EndAnalysisDelegate(endAnalysis)); } else { this.setProgress(100); abortButton.Enabled = false; analyzeGroup.Enabled = true; generateGroup.Enabled = true; this.ac = null; } } /// /// Delegate for result summary display method. /// /// Result summary string. private delegate void SetResultDelegate(String res); /// /// Displays analysis results summary. /// /// Result summary string. public void setResult(String res) { if (this.InvokeRequired) { this.Invoke(new SetResultDelegate(setResult), new object[] { res }); } else { resultTextBox.Text = res; } } /// /// "Abort" button click event. /// /// /// private void abortButton_Click(object sender, EventArgs e) { if (this.ac != null) { this.ac.abortAnalysis(); } } /// /// Mass checkboxes within contract table layout toggle method. /// /// Set of x-coordinates for checkboxes to toggle. /// Set of y-coordinates for checkboxes to toggle. private void toggleBoxes(IEnumerable xRange, IEnumerable yRange) { foreach (int x in xRange) { foreach (int y in yRange) { CheckBox cb = ((CheckBox)contractTable.GetControlFromPosition(x, y)); cb.Checked = !cb.Checked; } } } /// /// Toggles all contract chackboxes. /// /// /// private void button3_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(1, 4)); } /// /// Toggles the first column of checkboxes ("NT"). /// /// /// private void label18_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 1), Enumerable.Range(1, 4)); } /// /// Toggles the second column of checkboxes (spades). /// /// /// private void label14_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(2, 1), Enumerable.Range(1, 4)); } /// /// Toggles the third column of checkboxes (hearts). /// /// /// private void label15_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(3, 1), Enumerable.Range(1, 4)); } /// /// Toggles the fourth column of checkboxes (diamonds). /// /// /// private void label16_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(4, 1), Enumerable.Range(1, 4)); } /// /// Toggles the fifth column of checkboxes (clubs). /// /// /// private void label17_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(5, 1), Enumerable.Range(1, 4)); } /// /// Toggles the first row of checkboxes (North). /// /// /// private void label19_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(1, 1)); } /// /// Toggles the second row of checkboxes (East). /// /// /// private void label20_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(2, 1)); } /// /// Toggles the third row of checkboxes (South). /// /// /// private void label21_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(3, 1)); } /// /// Toggles the fourth row of checkboxes (West). /// /// /// private void label22_Click(object sender, EventArgs e) { this.toggleBoxes(Enumerable.Range(1, 5), Enumerable.Range(4, 1)); } private void button4_Click(object sender, EventArgs e) { } /// /// Enables contract table fields accordingly to selected combo boxes. /// /// /// private void tableCombo_Change(object sender, EventArgs e) { TableLayoutPanelCellPosition position = fullContractTable.GetPositionFromControl((Control)sender); NumericUpDown frequencyBox = (NumericUpDown)fullContractTable.GetControlFromPosition(4, position.Row); Contract rowContract = this.getContractFromTableRow(position.Row); if (rowContract != null) { frequencyBox.Enabled = true; if (frequencyBox.Value < 1) { frequencyBox.Value = 1; } if (rowContract.Level == 0) { ((ComboBox)fullContractTable.GetControlFromPosition(1, position.Row)).SelectedIndex = 0; ((ComboBox)fullContractTable.GetControlFromPosition(2, position.Row)).SelectedIndex = 0; ((ComboBox)fullContractTable.GetControlFromPosition(3, position.Row)).SelectedIndex = 0; } } else { frequencyBox.Enabled = false; frequencyBox.Value = 0; } } private Contract getContractFromTableRow(int rowIndex) { ComboBox levelBox = (ComboBox)fullContractTable.GetControlFromPosition(0, rowIndex); ComboBox denominationBox = (ComboBox)fullContractTable.GetControlFromPosition(1, rowIndex); ComboBox modifiersBox = (ComboBox)fullContractTable.GetControlFromPosition(2, rowIndex); ComboBox declarerBox = (ComboBox)fullContractTable.GetControlFromPosition(3, rowIndex); if (levelBox.SelectedIndex < 1 || (denominationBox.SelectedIndex < 1 && levelBox.SelectedIndex != 1) || (declarerBox.SelectedIndex < 1 && levelBox.SelectedIndex != 1)) { return null; } return new Contract(levelBox.SelectedIndex - 1, denominationBox.SelectedIndex, declarerBox.SelectedIndex, modifiersBox.SelectedIndex); } } }