public Switch(State from, State to, string input, string output) { From = from; To = to; Input = input; Output = output; }
private void State_SigmaStep(State sender, State.SigmaInterruptArgs e) { ThreadingControlsHelper.SyncInvoke( this, () => { txtInput.SelectionStart = txtInput.TextLength - e.RemainingWord.Length; txtInput.SelectionLength = e.RemainingWord.Length; txtOutput.Text = StateStackToString(e.StateStack); txtOutput.AppendText(Environment.NewLine); txtOutput.AppendText( resMan.GetString("Testresult_Output", currCult) + ": "); txtOutput.AppendText(e.CurrentOutput); suMain.TestState = sender; Application.DoEvents(); Thread.Sleep(50); }); if (cancelTest) { suMain.TestState = null; UpdateButtonStatesTest(false, false); Thread.CurrentThread.Abort(); } if (interruptTest) { UpdateButtonStatesTest(true, true); Thread.CurrentThread.Suspend(); } }
private void Build() { if (dgvTable.Rows.Count == 0) { suMain.States = null; return; } SortedDictionary<string, State> newStates = new SortedDictionary<string, State>(), oldStates = suMain.States; Dictionary<int, string> rowToName = new Dictionary<int, string>(); for (int i = 0; i < dgvTable.Rows.Count - 1; i++) { string name = dgvTable.Rows[i].Cells[0].Value as string; if (string.IsNullOrEmpty(name) || newStates.ContainsKey(name)) continue; object isStart = dgvTable.Rows[i].Cells[1].Value; object isAccepted = dgvTable.Rows[i].Cells[2].Value; State state = new State(name, isAccepted == null ? false : (bool)isAccepted, isStart == null ? false : (bool)isStart); newStates.Add(state.Name, state); rowToName.Add(i, name); if (oldStates.ContainsKey(state.Name)) newStates[state.Name].Location = oldStates[state.Name].Location; else newStates[state.Name].Location = new Point(State.STATE_SIZE + i * State.STATE_SIZE * 4, State.STATE_SIZE * 3); } for (int i = 0; i < dgvTable.Rows.Count - 1; i++) { using (DataGridViewRow row = dgvTable.Rows[i]) { if (!rowToName.ContainsKey(i)) continue; string name = rowToName[i]; for (int col = 3; col < dgvTable.Columns.Count; col++) { string value = row.Cells[col].Value as string; if (string.IsNullOrEmpty(value)) continue; Match m = nondeterministic ? nfaParse.Match(value) : dfaParse.Match(value); if (m!=null) { for (int capture = 0; capture < m.Groups["switch"].Captures.Count; capture++) { string dest = m.Groups["dest"].Captures[capture].Value; if (!newStates.ContainsKey(dest)) continue; string input = dgvTable.Columns[col].HeaderText; string output = m.Groups["output"].Captures[capture].Value; if (!string.IsNullOrEmpty(output)) output = output.TrimStart(new char[] { '/', ' ' }); Switch sw = new Switch(newStates[name], newStates[dest], input, output); sw.From.Destinations.Add(sw); sw.To.Sources.Add(sw); } } } } } foreach (State s in newStates.Values) { if (oldStates.ContainsKey(s.Name)) { State oldState = oldStates[s.Name]; foreach (Switch swOld in oldState.Destinations) { foreach(Switch swNew in s.Destinations) if (swOld.ToName == swNew.ToName) { swNew.C1Offset = swOld.C1Offset; swNew.C1ROffset = swOld.C1ROffset; swNew.C2Offset = swOld.C2Offset; swNew.C2ROffset = swOld.C2ROffset; } } } } suMain.States = newStates; }
private static void OnSigmaStep(State sender, SigmaInterruptArgs e) { if (SigmaStep != null) SigmaStep(sender, e); }
private void initControls() { RichTextBox rtb = new RichTextBox(); rtb.AppendText("DrawEA\n"); rtb.SelectAll(); rtb.SelectionFont = new Font(Font.FontFamily, Font.Size*2, FontStyle.Bold); rtb.SelectionLength = 0; rtb.SelectionStart = rtb.Text.Length; rtb.AppendText("Version " + Application.ProductVersion); rtb.SelectionLength = rtb.Text.Length - rtb.SelectionStart; rtb.SelectionFont = new Font(Font, FontStyle.Italic); rtb.ReadOnly = true; rtb.BackColor = Color.White; rtb.BorderStyle = BorderStyle.None; rtb.Location = new Point(50, 10); rtb.Size = new Size(200, 50); Controls.Add(rtb); Button close = new Button(); close.Text = "x"; close.Size = new Size(20, 20); close.Location = new Point(275, 5); close.Click += delegate { Close(); }; Controls.Add(close); LinkLabel lblMail = new LinkLabel(); lblMail.Text = "© 2006-2008 Andreas K."; lblMail.LinkArea = new LinkArea(12, 10); lblMail.LinkBehavior = LinkBehavior.HoverUnderline; lblMail.LinkClicked += delegate { System.Diagnostics.Process.Start("mailto:\"Andreas Krohn\"<*****@*****.**>?subject=DrawEA%20Version%20"+Application.ProductVersion); }; lblMail.AutoSize = true; lblMail.Dock = DockStyle.Bottom; Controls.Add(lblMail); Bitmap bmp = new Bitmap(300, 190); Graphics g = Graphics.FromImage(bmp); int oldSize = State.STATE_SIZE; State.STATE_SIZE = 40; State A = new State("A", false, true); State B = new State("B", true, false); State C = new State("C", false, false); A.Destinations.Add(new Switch(A, B, "1", "done")); A.Destinations.Add(new Switch(A, C, "0", string.Empty)); B.Destinations.Add(new Switch(B, B, "0", string.Empty)); B.Destinations.Add(new Switch(B, B, "1", string.Empty)); C.Destinations.Add(new Switch(C, A, "1", string.Empty)); C.Destinations.Add(new Switch(C, C, "0", string.Empty)); A.Location = new Point(40, 40); B.Location = new Point(230, 60); C.Location = new Point(160, 140); A.CalculateSwitchPoints(); B.CalculateSwitchPoints(); C.CalculateSwitchPoints(); StringFormat sf = new StringFormat {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center}; using (Pen borderPen = new Pen(ForeColor, 4f)) using (Pen switchOutline = new Pen(Color.FromArgb(220, BackColor), 5f)) using (Pen switchPen = new Pen(ForeColor, 4f) { EndCap = LineCap.Custom, CustomEndCap = new AdjustableArrowCap(3, 3, true) }) { g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height); g.CompositingQuality = CompositingQuality.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBilinear; g.SmoothingMode = SmoothingMode.HighQuality; A.Draw(g, Brushes.White, borderPen, switchPen, Font, sf); B.Draw(g, Brushes.White, borderPen, switchPen, Font, sf); C.Draw(g, Brushes.White, borderPen, switchPen, Font, sf); A.DrawAllSwitches(g, A.CenterPoint(), switchPen, switchOutline, Font, sf, false); B.DrawAllSwitches(g, B.CenterPoint(), switchPen, switchOutline, Font, sf, true); C.DrawAllSwitches(g, C.CenterPoint(), switchPen, switchOutline, Font, sf, false); } State.STATE_SIZE = oldSize; PictureBox pb = new PictureBox(); pb.SizeMode = PictureBoxSizeMode.AutoSize; pb.Image = bmp; pb.Location = new Point(0,60); Controls.Add(pb); close.Select(); }