public void LoadDiagramFromXml( System.Xml.XmlNode node)
 {
     GOMLib.GOM_Diagram diagram = new GOMLib.GOM_Diagram();
     diagram.LoadFromXML(node, null);
     this.m_rgObjects = diagram.Objects;
     this.m_rgLinks = diagram.Links;
     DrawObjectsOnCanvas();
 }
        public DrawingForm(string templatePath)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
            m_LButtonPressed	= false;
            m_CtrlPressed		= false;
            m_bRedoing			= false;

            m_selectingRect	= new System.Drawing.Rectangle(0, 0, 0, 0);
            m_selectedPen	= new Pen(System.Drawing.Color.FromArgb(150, 0, 0, 255), 1);
            m_groupSelPen	= new Pen(System.Drawing.Color.FromArgb(255, 200, 200, 200), 1);
            m_selectingPen	= new Pen(System.Drawing.Color.FromArgb(100, 0, 0, 0), 1);
            m_groupSelPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            m_selectingPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

            m_frmColor					= new ColorForm();
            m_frmColor.TopLevel			= false;
            m_frmColor.FormBorderStyle	= FormBorderStyle.None;
            m_frmColor.Visible			= false;
            m_frmColor.DrawingStyleChanged	+= new DrawingStyleChangedEvent(m_frmColor_DrawingStyleChanged);
            m_frmColor.FillingStyleChanged	+= new FillingStyleChangedEvent(m_frmColor_FillingStyleChanged);

            m_frmEdit					= new EditForm();
            m_frmEdit.TopLevel			= false;
            m_frmEdit.FormBorderStyle	= FormBorderStyle.None;
            m_frmEdit.Visible			= false;
            m_frmEdit.CommandSelected	+= new CommandSelectedEvent(m_frmEdit_CommandSelected);

            m_frmLink					= new LinkForm();
            m_frmLink.TopLevel			= false;
            m_frmLink.FormBorderStyle	= FormBorderStyle.None;
            m_frmLink.Visible			= false;
            m_frmLink.LinkStyleChanged	+= new LinkStyleChangedEvent(m_frmLink_LinkStyleChanged);
            m_frmLink.RemoveLink		+= new RemoveLinkEvent(m_frmLink_RemoveLink);

            m_frmInfo = new InfoForm();
            m_frmInfo.TopLevel = false;
            m_frmInfo.FormBorderStyle = FormBorderStyle.None;
            m_frmInfo.Visible = false;
            m_frmInfo.DrawingInfoChanged += new DrawingInfoChanged(m_frmInfo_DrawingInfoChanged);
            tagInfo.TagControl = m_frmInfo;
            //m_frmLink.LoadLinkStyle(Environment.CurrentDirectory + "\\Links");

            tagColor.TagControl	= m_frmColor;
            tagEdit.TagControl	= m_frmEdit;
            tagLink.TagControl	= m_frmLink;

            m_clipBoard	= new GOMLib.GOM_Objects();
            m_selObjs	= new GOMLib.GOM_Objects();
            m_rgObjects	= new GOMLib.GOM_Objects();
            m_bitmap	= new Bitmap(plDraw.Width, plDraw.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            m_preprocess = new PreprocessQueue();
            m_preprocess.m_bDebugging	= false;
            m_preprocess.UpdateRequired += new PreprocessOverEvent(m_preprocess_UpdateRequired);
            m_preprocess.StartPreprocessThread();

            m_recognition = new RecognitionQueue(templatePath);
            m_recognition.m_bDebugging		= false;
            m_recognition.RecognitionStart	+= new RecognitionEvent(m_recognition_RecognitionStart);
            m_recognition.RecognitionEnd	+= new RecognitionEvent(m_recognition_RecognitionEnd);
            m_recognition.RecognitionOver	+= new RecognitionOverEvent(m_recognition_RecognitionOver);
            m_recognition.StartRecognitionThread();

            m_rgRedoList= new ArrayList();
            m_rgLinks	= new GOMLib.GOM_Links();
            m_rgStroke	= null;
            m_sketch	= null;

            m_selectedPoint	= null;
            m_selectedLink	= null;
            m_selectedLinkKeyPoint = null;

            m_tracker = new MouseTrackerLib.CTrackerClass();

            Graphics.FromImage(m_bitmap).FillRectangle(System.Drawing.Brushes.White, 0, 0, plDraw.Width, plDraw.Height);
        }
        private void m_frmEdit_CommandSelected(EditCommands command)
        {
            if (status.Action == UserActions.Editing)
            {
                switch (command)
                {
                    case EditCommands.Group:
                    {
                        if (m_selObjs.Count > 1)
                        {
                            GOMLib.GOM_Interface_Graphic_Object	obj;

                            obj = GOMLib.GOM_Object_Group.CreateGroupObject(m_selObjs);

                            if (obj != null)
                            {
                                for (int i = 0; i < m_selObjs.Count; i++)
                                {
                                    m_rgObjects.Remove(m_selObjs[i]);
                                }

                                m_rgObjects.Add(obj);

                                m_selObjs.Clear();
                                m_selObjs.Add(obj);

                                DrawObjectsOnCanvas();
                            }
                        }
                        break;
                    }
                    case EditCommands.Ungroup:
                    {
                        if (m_selObjs.Count == 1)
                        {
                            if (m_selObjs[0] is GOMLib.GOM_Object_Group)
                            {
                                GOMLib.GOM_Objects	rgObjs;

                                rgObjs = new GOMLib.GOM_Objects();

                                ((GOMLib.GOM_Object_Group)m_selObjs[0]).DecomposeGroupObject(rgObjs);

                                m_rgObjects.Remove(m_selObjs[0]);
                                m_selObjs.Clear();

                                for (int i = 0; i < rgObjs.Count; i++)
                                {
                                    m_rgObjects.Add(rgObjs[i]);
                                    m_selObjs.Add(rgObjs[i]);
                                }

                                DrawObjectsOnCanvas();
                            }
                        }
                        break;
                    }
                    case EditCommands.BringToFront:
                    {
                        if (m_selObjs.Count > 0)
                        {
                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Remove(m_selObjs[i]);
                            }

                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Add(m_selObjs[i]);
                            }

                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.SendToBack:
                    {
                        if (m_selObjs.Count > 0)
                        {
                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Remove(m_selObjs[i]);
                            }

                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Insert(m_selObjs[i], 0);
                            }

                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.Delete:
                    {
                        if (m_selObjs.Count > 0)
                        {
                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Remove(m_selObjs[i]);

                                int j = 0;

                                while (j < m_rgLinks.Count)
                                {
                                    if (((GOMLib.GOM_Link)m_rgLinks[j]).LinkWith(m_selObjs[i]))
                                    {
                                        if (m_rgLinks[j].Equals(m_selectedLink))
                                        {
                                            m_selectedLink = null;
                                        }

                                        m_rgLinks.RemoveAt(j);
                                    }
                                    else
                                    {
                                        j++;
                                    }
                                }
                            }

                            m_selObjs.Clear();
                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.Cut:
                    {
                        if (m_selObjs.Count > 0)
                        {
                            m_clipBoard.Clear();

                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_rgObjects.Remove(m_selObjs[i]);
                                m_clipBoard.Add(m_selObjs[i]);
                            }

                            m_selObjs.Clear();
                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.Copy:
                    {
                        if (m_selObjs.Count > 0)
                        {
                            m_clipBoard.Clear();

                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_clipBoard.Add(m_selObjs[i]);
                            }
                        }
                        break;
                    }
                    case EditCommands.Paste:
                    {
                        if (m_clipBoard.Count > 0)
                        {
                            float	minX, minY;

                            m_selObjs.Clear();

                            for (int i = 0; i < m_clipBoard.Count; i++)
                            {
                                m_selObjs.Add(m_clipBoard[i].Clone());
                            }

                            minX = m_selObjs[0].xOffset;
                            minY = m_selObjs[0].yOffset;

                            for (int i = 1; i < m_selObjs.Count; i++)
                            {
                                minX = Math.Min(minX, m_selObjs[i].xOffset);
                                minY = Math.Min(minY, m_selObjs[i].yOffset);
                            }

                            minX = tagEdit.Left - minX;
                            minY = tagEdit.Top - minY;

                            for (int i = 0; i < m_selObjs.Count; i++)
                            {
                                m_selObjs[i].xOffset += minX;
                                m_selObjs[i].yOffset += minY;

                                m_rgObjects.Add(m_selObjs[i]);
                            }

                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.Sketch:
                    {
                        if (m_selObjs.Count == 1)
                        {
                            if (m_selObjs[0] is GOMLib.GOM_Object_Sketch)
                            {
                                m_sketch = (GOMLib.GOM_Object_Sketch)m_selObjs[0];

                                m_rgObjects.Remove(m_sketch);
                                m_selObjs.Clear();

                                status.Action = UserActions.Sketching;
                                if ( DrawingModeChanged != null )
                                {
                                    DrawingModeChanged(DrawingMode.Sketching);
                                }

                                DrawObjectsOnCanvas();
                            }
                        }
                        break;
                    }
                }
            }

            if (status.Action == UserActions.Sketching)
            {
                switch (command)
                {
                    case EditCommands.Undo:
                    {
                        if (m_sketch != null)
                        {
                            while (m_sketch.rgStrokeToSketch.Count > 0)
                            {
                                if ((int)(m_sketch.rgStrokeToSketch[m_sketch.rgStrokeToSketch.Count - 1]) == m_sketch.rgSketchSet.Count)
                                {
                                    m_sketch.rgStrokeToSketch.RemoveAt(m_sketch.rgStrokeToSketch.Count - 1);
                                    m_sketch.rgDrawings.RemoveAt(m_sketch.rgDrawings.Count - 1);
                                }
                                else
                                {
                                    break;
                                }
                            }

                            if (m_sketch.rgSketchSet.Count > 0)
                            {
                                m_rgRedoList.Add(m_sketch.rgSketchSet[m_sketch.rgSketchSet.Count - 1]);
                                m_sketch.rgSketchSet.RemoveAt(m_sketch.rgSketchSet.Count - 1);
                            }

                            ClearRecognitionResult();

                            if (m_sketch.rgSketchSet.Count > 0)
                            {
            //								m_recognition.PushStrokeAndWait(m_sketch.ExportRecognitionResultToXML());
                                m_recognition.PushStroke(m_sketch.ExportRecognitionResultToXML());
                            }

                            DrawObjectsOnCanvas();
                        }
                        break;
                    }
                    case EditCommands.Redo:
                    {
                        if (m_rgRedoList.Count > 0)
                        {
                            if (m_sketch != null)
                            {
                                ClearRecognitionResult();

                                m_bRedoing = true;
                                m_sketch.rgSketchSet.Add(m_rgRedoList[m_rgRedoList.Count - 1]);
                                m_preprocess.PushSketchAndWait(m_sketch, (ArrayList)m_rgRedoList[m_rgRedoList.Count - 1]);
                                m_rgRedoList.RemoveAt(m_rgRedoList.Count - 1);

                                DrawObjectsOnCanvas();
                            }
                        }
                        break;
                    }
                }
            }

            tagEdit.HideTagWindow();
        }