private void UpdateSketchTrack()
        {
            if ((m_rgStroke != null) && (m_LButtonPressed))
            {
                System.Drawing.Point pt;

                pt = plDraw.PointToClient(System.Windows.Forms.Cursor.Position);

                if ((pt.X == m_orgX) && (pt.Y == m_orgY))
                {
                    return;
                }

                m_orgX = pt.X;
                m_orgY = pt.Y;

                GOMLib.SketchPoint	point = new GOMLib.SketchPoint();

                point.x = pt.X;
                point.y = pt.Y;
                point.time = Environment.TickCount;

                m_rgStroke.Add(point);
                DrawCurrentStroke(plDraw.CreateGraphics());
            }
        }
        private System.Collections.ArrayList DecodePointTrackFromXML(string xmlTrack)
        {
            System.Xml.XmlDocument			doc;
            System.Collections.ArrayList	rgStroke;
            GOMLib.SketchPoint				pt;

            rgStroke = new ArrayList();

            try
            {
                doc = new System.Xml.XmlDocument();
                doc.LoadXml(xmlTrack);

                if (System.String.Compare(doc.DocumentElement.Name, "input", true) == 0)
                {
                    for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++)
                    {
                        pt = new GOMLib.SketchPoint();
                        pt.x = int.Parse(doc.DocumentElement.ChildNodes[i].Attributes["x"].Value);
                        pt.y = int.Parse(doc.DocumentElement.ChildNodes[i].Attributes["y"].Value);
                        pt.time = int.Parse(doc.DocumentElement.ChildNodes[i].Attributes["t"].Value);
                        rgStroke.Add(pt);
                    }
                }
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Invalid format in mouse tracking.");
            }

            return rgStroke;
        }
        private void plDraw_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                m_LButtonPressed = false;
            }

            switch (e.Button)
            {
                case System.Windows.Forms.MouseButtons.Left:
                {
                    switch (status.Action)
                    {
                        case UserActions.Linking:
                        {
                            for (int i = 0; i < m_rgObjects.Count; i++)
                            {
                                GOMLib.GOM_Point pt;

                                pt = m_rgObjects[i].GetConnectablePointAt(e.X, e.Y);

                                if (pt!= null)
                                {

                                    if ( m_selObjs[0]!=m_rgObjects[i] || m_selectedPoint!=pt )
                                    {
                                        GOMLib.GOM_Link				link;

                                        link = GOMLib.GOM_Default_Values.CreateLink( m_selObjs[0], m_selectedPoint, m_rgObjects[i], pt);
                                        AddLinkWithMergemence(link);
                                        m_selObjs.Clear();
                                        m_selectedLink = link;
                                        break;
                                    }

                                }
                            }

                            status.Action	= UserActions.Editing;
                            m_selectedPoint = null;
                            DrawObjectsOnCanvas();

                            break;
                        }
                        case UserActions.Sketching:
                        {
                            FinishCurrentSketchStroke();
                            break;
                        }
                        case UserActions.Editing:
                        {
                            break;
                        }
                        case UserActions.InsertObject:
                        {
                            GOMLib.GOM_Object_Primitive	primitive;

                            primitive = new GOMLib.GOM_Object_Primitive();
                            primitive.InitializeFromTemplate(status.Template);
                            primitive.xOffset = e.X;
                            primitive.yOffset = e.Y;
                            GOMLib.GOM_Default_Values.ScaleObject(primitive, 25, 25);
                            m_rgObjects.Add(primitive);

                            status.Action	= UserActions.Editing;
                            status.Template	= null;

                            m_selObjs.Clear();
                            m_selObjs.Add(primitive);

                            DrawObjectsOnCanvas();
                            break;
                        }
                        case UserActions.Controlling:
                        {
                            plDraw.Capture	= false;

                            status.Action	= UserActions.Editing;
                            m_selectedPoint	= null;
                            break;
                        }
                        case UserActions.Moving:
                        {
                            plDraw.Capture	= false;

                            status.Action	= UserActions.Editing;

                            if ( m_selObjs.Count == 1 )
                            {
                                GOMLib.GOM_Interface_Graphic_Object graphicObject = m_selObjs[0];

                                bool touched = false;
                                for ( int i=0; i<m_rgObjects.Count; i++ )
                                {
                                    GOMLib.GOM_Object_LinkNode linkNode = m_rgObjects[i] as GOMLib.GOM_Object_LinkNode;
                                    if ( !(graphicObject is GOMLib.GOM_Object_LinkNode) && linkNode != null )
                                    {
                                        GOMLib.GOM_Links links = GetLinks(linkNode);
                                        if ( links.Count == 1 )
                                        {
                                            GOMLib.GOM_Point touchedPoint = graphicObject.GetConnectablePointAt((int)linkNode.xOffset, (int)linkNode.yOffset);
                                            if ( touchedPoint != null )
                                            {
                                                if ( links[0].m_startObj == linkNode )
                                                {
                                                    links[0].m_startObj = graphicObject;
                                                    links[0].m_startPt = touchedPoint;
                                                }
                                                else
                                                {
                                                    links[0].m_endObj = graphicObject;
                                                    links[0].m_endPt = touchedPoint;
                                                }
                                                m_rgObjects.Remove(linkNode);
                                                touched = true;
                                            }
                                        }
                                    }
                                }

                                if ( touched )
                                {
                                    DrawObjectsOnCanvas();
                                }
                            }

                            break;
                        }
                        case UserActions.MovingKeyPoint:
                        {
                            m_selectedLinkKeyPoint = null;
                            status.Action	= UserActions.Editing;

                            if ( m_selectedLink.m_keyPts != null )
                            {
                                ArrayList pts = new ArrayList();
                                PointF ptf = m_selectedLink.StartPointInCanvas(m_rgObjects);
                                GOMLib.SketchPoint spt = new GOMLib.SketchPoint();
                                spt.x = (int)ptf.X;
                                spt.y = (int)ptf.Y;
                                pts.Add( spt );
                                for( int i=0; i<m_selectedLink.m_keyPts.Count; i++ )
                                {
                                    spt = new GOMLib.SketchPoint();
                                    spt.x = (int)m_selectedLink.m_keyPts[i].x;
                                    spt.y = (int)m_selectedLink.m_keyPts[i].y;
                                    pts.Add( spt );
                                }
                                ptf = m_selectedLink.EndPointInCanvas(m_rgObjects);
                                spt = new GOMLib.SketchPoint();
                                spt.x = (int)ptf.X;
                                spt.y = (int)ptf.Y;
                                pts.Add( spt );

                                pts = CalculateSegments(pts);

                                m_selectedLink.m_keyPts = new GOMLib.GOM_Points();
                                for( int i=0; i<(pts.Count-2); i++ )
                                {
                                    GOMLib.GOM_Point pt = new GOMLib.GOM_Point();
                                    pt.x = ((GOMLib.SketchPoint)pts[i+1]).x;
                                    pt.y = ((GOMLib.SketchPoint)pts[i+1]).y;
                                    m_selectedLink.m_keyPts.Add( pt );
                                }
                            }

                            DrawObjectsOnCanvas();
                            break;
                        }
                        case UserActions.Selecting:
                        {
                            System.Drawing.Region	rgn;
                            System.Drawing.Region	rgnIntersect;
                            System.Drawing.Graphics	canvas;

                            rgn		= new Region(m_selectingRect);

                            canvas	= plDraw.CreateGraphics();

                            for (int i = 0; i < m_rgObjects.Count; i++)
                            {
                                rgnIntersect = rgn.Clone();
                                rgnIntersect.Intersect(m_rgObjects[i].BoundingRegion);

                                if (!rgnIntersect.IsEmpty(canvas))
                                {
                                    m_selObjs.Add(m_rgObjects[i]);
                                }
                            }
                            plDraw.Capture	= false;

                            status.Action	= UserActions.Editing;

                            m_selectingRect.X		= 0;
                            m_selectingRect.Y		= 0;
                            m_selectingRect.Width	= 0;
                            m_selectingRect.Height	= 0;

                            DrawObjectsOnCanvas();
                            break;
                        }
                    }
                    break;
                }
            }
        }