public void StartDFA()
        {
            foreach (VertexView v in canvasView1.Views.OfType <VertexView>())
            {
                if (v.Vertex.IsStart)
                {
                    currentVV = v;
                }
                v.IsHighLighted = false;
            }
            if (currentVV != null)
            {
                strip.Clear();
                foreach (char c in tbPath.Text)
                {
                    strip.Add(c.ToString());
                }
                stripPointer = 0;

                currentVV.IsHighLighted = true;

                canvasView1.Refresh();
                timer1.Start();
                btnStart.Visible = false;
                btnPause.Visible = true;
            }
            else
            {
                //ERROR
            }
        }
        private void BtnStep_Click(object sender, EventArgs e)
        {
            if (isPause)
            {
                StepDFA();
            }
            else
            {
                foreach (VertexView v in canvasView1.Views.OfType <VertexView>())
                {
                    if (v.Vertex.IsStart)
                    {
                        currentVV = v;
                    }
                    v.IsHighLighted = false;
                }
                if (currentVV != null)
                {
                    strip.Clear();
                    foreach (char c in tbPath.Text)
                    {
                        strip.Add(c.ToString());
                    }
                    stripPointer = 0;

                    currentVV.IsHighLighted = true;

                    canvasView1.Refresh();
                }
                else
                {
                    //ERROR
                }
            }
        }
        private void On_MouseUp(IView sender)
        {
            if (moving != null)
            {
                moving = null;
            }
            if (isAdding)
            {
                isAdding = false;

                if (Over != null)
                {
                    if (Equals(EPreview.Edge.Vertex1, Over.Vertex))
                    {
                        this.Text = "";
                    }
                    graph.AddEdge(EPreview.Edge.Vertex1, Over.Vertex);
                }
                else
                {
                    graph.AddVertex();
                    (canvasView1.Views[canvasView1.Views.Count - 1] as VertexView).Location = VPreview.Location;
                    graph.AddEdge(EPreview.Edge.Vertex1, (canvasView1.Views[canvasView1.Views.Count - 1] as VertexView).Vertex);
                }
                canvasView1.Views.Remove(VPreview);
                canvasView1.Views.Remove(EPreview);
            }
            canvasView1.Refresh();
        }
        private void On_Mouse_Move(Object sender, MouseEventArgs e)
        {
            VertexView v_on_over = VertexHitTest(new Point(e.X, e.Y));
            EdgeView   e_on_over = EdgeHitTest(new Point(e.X, e.Y));

            foreach (VertexView v in Views.OfType <VertexView>())
            {
                if (v_on_over != null && v == v_on_over)
                {
                    v_on_over.Raise_MouseEnter();
                    v_on_over.Raise_MouseMove();
                }
                else
                {
                    v.Raise_MouseLeave();
                }
            }

            foreach (EdgeView v in Views.OfType <EdgeView>())
            {
                if (e_on_over != null && v == e_on_over)
                {
                    e_on_over.Raise_MouseEnter();
                }
                else
                {
                    v.Raise_MouseLeave();
                }
            }



            Refresh();
        }
        private VertexView VertexAdd(Vertex vertex, Point location)
        {
            VertexView v = new VertexView();

            v.Vertex      = vertex;
            v.Location    = location;
            v.MouseDown  += On_MouseDown;
            v.MouseUp    += On_MouseUp;
            v.MouseLeave += On_MouseLeave;
            v.MouseEnter += On_MouseEnter;
            return(v);
        }
        private VertexView VertexAdd(Vertex vertex)
        {
            VertexView v = new VertexView();

            v.Vertex      = vertex;
            v.Location    = new Point(r.Next(v.Radius, canvasView1.Width - v.Radius), r.Next(v.Radius, canvasView1.Height - v.Radius));
            v.MouseDown  += On_MouseDown;
            v.MouseUp    += On_MouseUp;
            v.MouseLeave += On_MouseLeave;
            v.MouseEnter += On_MouseEnter;
            return(v);
        }
        public void On_VertexRemoved(Graph sender, Vertex vertex)
        {
            VertexView v = canvasView1.FindViewByVertex(vertex);

            if (v != null)
            {
                v.MouseDown  -= On_MouseDown;
                v.MouseUp    -= On_MouseUp;
                v.MouseLeave -= On_MouseLeave;
                v.MouseEnter -= On_MouseEnter;
                canvasView1.Views.Remove(v);
            }
            v = null;
            canvasView1.Refresh();
        }
 private void On_MouseMove(Object sender, MouseEventArgs e)
 {
     if (moving != null)
     {
         moving.Location = new Point(OldPoint.X + (MousePosition.X - StartPoint.X), OldPoint.Y + (MousePosition.Y - StartPoint.Y));
         foreach (Edge ed in graph.NeihbourEdges(moving.Vertex))
         {
             if (canvasView1.FindViewByEdge(ed).Edge.Vertex1 == moving.Vertex)
             {
                 if (canvasView1.FindViewByEdge(ed).Edge.Vertex2 == moving.Vertex)
                 {
                     canvasView1.FindViewByEdge(ed).Point1 = moving.Location;
                     canvasView1.FindViewByEdge(ed).Point2 = moving.Location;
                 }
                 else
                 {
                     canvasView1.FindViewByEdge(ed).Point1 = moving.Location;
                 }
             }
             else
             {
                 canvasView1.FindViewByEdge(ed).Point2 = moving.Location;
             }
         }
     }
     if (isAdding)
     {
         VertexView hitTest = canvasView1.VertexHitTest(new Point(e.X, e.Y), VPreview);//, VPreview);
         if (hitTest != null)
         {
             VPreview.Location = hitTest.Location;
             Over = hitTest;
         }
         else
         {
             VPreview.Location = new Point(OldPoint.X + (MousePosition.X - StartPoint.X), OldPoint.Y + (MousePosition.Y - StartPoint.Y));
             Over = null;
         }
         EPreview.Point2 = canvasView1.FindViewByVertex(EPreview.Edge.Vertex2).Location;
     }
 }
        private void On_MouseDown(IView sender)
        {
            if (MouseButtons == MouseButtons.Left)
            {
                foreach (VertexView v in canvasView1.Views.OfType <VertexView>())
                {
                    v.IsSelected = false;
                }
                (sender as VertexView).IsSelected = true;


                tbNameNode.Text = (sender as VertexView).Vertex.Value;
                tbNameNode.Focus();
                tbNameNode.SelectAll();
                cbStartState.Checked = (sender as VertexView).Vertex.IsStart;
                cbFinalState.Checked = (sender as VertexView).Vertex.IsFinish;

                if (OnSelectedChange != null)
                {
                    OnSelectedChange(sender as VertexView);
                }
                canvasView1.BringToFront(sender);
                moving = (VertexView)sender;
            }
            else
            {
                VPreview.Location = (sender as VertexView).Location;
                VPreview.Vertex   = new Vertex("");
                canvasView1.Views.Add(VPreview);

                EPreview.Edge   = new Edge((sender as VertexView).Vertex, VPreview.Vertex);
                EPreview.Point1 = canvasView1.FindViewByVertex(EPreview.Edge.Vertex1).Location;
                EPreview.Point2 = canvasView1.FindViewByVertex(EPreview.Edge.Vertex2).Location;
                canvasView1.Views.Add(EPreview);
                canvasView1.BringToFront(VPreview);
                isAdding = true;
                Over     = (sender as VertexView);
            }
            OldPoint   = (sender as VertexView).Location;
            StartPoint = MousePosition;
        }
 public void StepDFA()
 {
     if (stripPointer < strip.Count)
     {
         foreach (Edge e in graph.IncidentedEdges(currentVV.Vertex))
         {
             if (e.Value.Contains(strip[stripPointer]))
             {
                 currentVV.IsHighLighted = false;
                 currentVV = canvasView1.FindViewByVertex(e.Vertex2);
                 currentVV.IsHighLighted = true;
                 break;
             }
         }
         stripPointer += 1;
         canvasView1.Refresh();
         StripRedraw();
     }
     else
     {
         timer1.Stop();
         stripPointer            = 0;
         isPause                 = false;
         currentVV.IsHighLighted = false;
         if (currentVV.Vertex.IsFinish)
         {
             lbResult.ForeColor = Color.GreenYellow;
             lbResult.Text      = "Accepted";
         }
         else
         {
             lbResult.ForeColor = Color.Tomato;
             lbResult.Text      = "Rejected";
         }
         btnStart.Visible = true;
         btnPause.Visible = false;
         StripRedraw();
     }
 }
        private void On_Mouse_Down(Object sender, MouseEventArgs e)
        {
            foreach (VertexView v in Views.OfType <VertexView>())
            {
                v.IsSelected = false;
            }
            VertexView on_down = VertexHitTest(new Point(e.X, e.Y));

            if (on_down != null)
            {
                on_down.Raise_MouseDown();
            }

            EdgeView on_click = EdgeHitTest(new Point(e.X, e.Y));

            if (on_click != null)
            {
                on_click.Raise_MouseClick();
            }

            Refresh();
        }
 void GraphForm_OnSelectedChange(VertexView v)
 {
     Selected = v;
 }