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;
                }
            }
        }
        public void ReplaceCurrentSketching(TemplatePack template)
        {
            GOMLib.GOM_Object_Primitive	primitive;

            if (status.Action == UserActions.Sketching)
            {
                m_sketch = null;

                primitive = new GOMLib.GOM_Object_Primitive();
                primitive.InitializeFromTemplate(template.template);

                primitive.xOffset	= template.rect.Left;
                primitive.yOffset	= template.rect.Top;

                GOMLib.GOM_Default_Values.ScaleObject(primitive, 25, 25);
            //				GOMLib.GOM_Default_Values.ScaleObject(primitive, template.rect.Width, template.rect.Height);
            /*
                double rotation = (template.rotation / System.Math.PI) * 180;

                if (rotation < 0)
                {
                    rotation += 360;
                }
                rotation = (float)System.Math.Round(rotation / 45) * 45;

                primitive.rotation	= (float)rotation;
            */
                m_rgObjects.Add(primitive);
                //save to somewhere
                //end

                m_sketch = new GOMLib.GOM_Object_Sketch();
                tagFishEye.ClearFishEyeItems();

                DrawObjectsOnCanvas();
            }
        }
 public TemplatePack()
 {
     bitmap		= null;
     template	= null;
     primitive	= null;
 }