예제 #1
0
        public override void OnMouseDown(Canvas drawArea, MouseEventArgs e)
        {
            Point point = drawArea.BackTrackMouse(new Point(e.X, e.Y));

            if (e.Button == MouseButtons.Left)
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (drawArea.ShortcutKey == Keys.Control ||
                        drawArea.ShortcutKey == Keys.Shift)
                    {
                        selectMode = SelectionMode.MulitSelection;
                        for (int i = drawArea.Document.Count - 1; i >= 0; i--)
                        {
                            int handleNumber = drawArea.Document[i].HitTest(point);
                            if (handleNumber == 0)
                            {
                                drawArea.Document[i].IsSelected = !drawArea.Document[i].IsSelected;
                                break;
                            }
                        }
                        return;
                    }
                }

                wasMove    = false;
                selectMode = SelectionMode.None;

                // Test for resizing
                for (int i = drawArea.Document.Count - 1; i >= 0; i--)
                {
                    int handleNumber = drawArea.Document[i].HitTest(point);
                    if (handleNumber > 0)
                    {
                        selectMode = SelectionMode.Size;
                        UndoService.BeginTransaction("Resize the shape");
                        resizedObject = drawArea.Document[i];

                        resizedObjectHandle = handleNumber;

                        drawArea.Document.CancelSelect();
                        drawArea.Document[i].IsSelected = true;
                        break;
                    }
                }


                // Test for move
                if (selectMode == SelectionMode.None)
                {
                    ShapeBase so = null;
                    for (int i = drawArea.Document.Count - 1; i >= 0; i--)
                    {
                        if (drawArea.Document[i].HitTest(point) == 0)
                        {
                            so = drawArea.Document[i];
                            break;
                        }
                    }

                    if (so != null)
                    {
                        UndoService.BeginTransaction("Move the shape");
                        selectMode = SelectionMode.Move;
                        // Unselect all if Ctrl is not pressed and clicked object is not selected yet
                        if ((Control.ModifierKeys & Keys.Control) == 0 && !so.IsSelected)
                        {
                            drawArea.Document.CancelSelect(true);
                        }

                        // Select clicked object
                        int paintcount = drawArea.Document.ShapeDraw.SelectedShapes.Length;
                        int textcount  = (from shape in drawArea.Document
                                          where
                                          shape.IsSelected &&
                                          (shape.Type == ShapeType.Text ||
                                           shape.Type == ShapeType.Time ||
                                           shape.Type == ShapeType.Temperature ||
                                           shape.Type == ShapeType.DynamicText)
                                          select shape).Count();

                        LayerControl lc = null;
                        if (so is ShapePaint && paintcount > 0)
                        {
                            so.BeginEdit();

                            //foreach (ShapeBase sb in drawArea.Document.ShapeDraw.SelectedShapes)
                            //    sb.IsSelected = false;

                            so.IsSelected = true;
                            so.EndEdit();
                            lc = drawArea.MessageControl.GetLayerControl(so);
                            if (lc != null)
                            {
                                lc.IsSelected = so.IsSelected;
                            }
                        }
                        else if ((so.Type == ShapeType.Text ||
                                  so.Type == ShapeType.Time ||
                                  so.Type == ShapeType.Temperature ||
                                  so.Type == ShapeType.DynamicText) && textcount > 0)
                        {
                            so.BeginEdit();
                            so.IsSelected = true;
                            so.EndEdit();
                            lc = drawArea.MessageControl.GetLayerControl(so);
                            if (lc != null)
                            {
                                lc.IsSelected = so.IsSelected;
                            }
                        }
                        else
                        {
                            so.IsSelected = true;
                        }

                        drawArea.Cursor = Cursors.SizeAll;
                    }
                }

                // Net selection
                if (selectMode == SelectionMode.None)
                {
                    //click on background
                    if ((Control.ModifierKeys & Keys.Control) == 0)
                    {
                        drawArea.Document.CancelSelect(true);
                    }

                    selectMode = SelectionMode.NetSelection;
                    UndoService.BeginTransaction("Select some shapes");
                    drawArea.DrawNetRectangle = true;
                }



                lastPoint  = point;
                startPoint = point;
            }
            else if (e.Button == MouseButtons.Right)
            {
                //drawArea.Document.CancelSelect(true);
                //for (int i = drawArea.Document.Count -1; i >= 0; i--)
                //{
                //    if (drawArea.Document[i].HitTest(point) >= 0)
                //    {
                //        drawArea.Document[i].IsSelected = true;
                //        break;
                //    }
                //}
                bool emptyInsect = false;
                foreach (ShapeBase s in drawArea.Document)
                {
                    if (s.HitTest(point) >= 0)
                    {
                        emptyInsect = true;
                        break;
                    }
                }
                if (!emptyInsect)
                {
                    drawArea.Document.CancelSelect(true);
                }
            }

            drawArea.Capture      = true;
            drawArea.NetRectangle = ShapeControlPaintNew.GetNormalizedRectangle(startPoint, lastPoint);
            drawArea.Refresh();
        }
예제 #2
0
        // Mouse is moved.
        // None button is pressed, ot left button is pressed.
        public override void OnMouseMove(Canvas drawArea, MouseEventArgs e)
        {
            Point point = drawArea.BackTrackMouse(new Point(e.X, e.Y));

            wasMove = true;
            if (e.Button == MouseButtons.None)
            {
                Cursor cursor = Cursors.Default;
                for (int i = drawArea.Document.Count - 1; i >= 0; i--)
                {
                    int n = drawArea.Document[i].HitTest(point);
                    if (n > 0)
                    {
                        cursor = drawArea.Document[i].GetHandleCursor(n);
                        break;
                    }
                }

                drawArea.Cursor = cursor;
                return;
            }

            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            if (point.X < 0)
            {
                point.X = 0;
            }
            if (point.X > drawArea.Width)
            {
                point.X = drawArea.Width;
            }

            if (point.Y < 0)
            {
                point.Y = 0;
            }
            if (point.Y > drawArea.Height)
            {
                point.Y = drawArea.Height;
            }

            if (lastPoint.X < 0)
            {
                lastPoint.X = 0;
            }
            if (lastPoint.X > drawArea.Width)
            {
                lastPoint.X = drawArea.Width;
            }

            if (lastPoint.Y < 0)
            {
                point.Y = 0;
            }
            if (lastPoint.Y > drawArea.Height)
            {
                lastPoint.Y = drawArea.Height;
            }


            // Left button is pressed
            // Find difference between previous and current position
            int dx = point.X - lastPoint.X;
            int dy = point.Y - lastPoint.Y;


            //加快移动速度
            int zoom = drawArea.MessageControl != null ?drawArea.MessageControl.Zoom : 6;

            if (Math.Abs(dx) < zoom && Math.Abs(dy) < zoom)
            {
                return;
            }

            int xOffset = dx % zoom;
            int yOffset = dy % zoom;

            if (xOffset != 0 || yOffset % zoom != 0)
            {
                dx -= xOffset;
                dy -= yOffset;
            }

            if (!ClampCanvas(drawArea, point))
            {
                return;
            }
            lastPoint = point;

            xOffset = point.X % zoom;
            yOffset = point.Y % zoom;
            if (xOffset != 0 || yOffset != 0)
            {
                if (xOffset <= zoom / 2)
                {
                    point.X -= xOffset;
                }
                else
                {
                    point.X = point.X + zoom - xOffset;
                }

                if (yOffset <= zoom / 2)
                {
                    point.Y -= yOffset;
                }
                else
                {
                    point.Y = point.Y + zoom - yOffset;
                }
            }


            // resize
            if (selectMode == SelectionMode.Size)
            {
                if (resizedObject != null)
                {
                    //if (resizedObject.Type == ShapeType.Text)
                    //{
                    //    ((ShapeLabel)resizedObject).FrameSizeFixed = true;
                    //}

                    if (resizedObject.Type != ShapeType.Line)
                    {
                        switch (resizedObjectHandle)
                        {
                        case 1:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 2:
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 3:
                            if (point.X <= resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 4:
                            if (point.X < resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            break;

                        case 5:
                            if (point.X <= resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            if (point.Y <= resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 6:
                            if (point.Y <= resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 7:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            if (point.Y < resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 8:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            break;

                        default:
                            break;
                        }
                        lastPoint = point;
                    }

                    resizedObject.MoveHandleTo(point, resizedObjectHandle);

                    drawArea.Document.ChangedService.MarkChanged();

                    if (resizedObject is ShapeLine)
                    {
                        lastPoint = resizedObject.GetHandle(resizedObjectHandle);
                    }

                    drawArea.Refresh();
                }
            }

            // move
            if (selectMode == SelectionMode.Move)
            {
                int movecount = 0;
                foreach (ShapeBase sb in drawArea.Document.SelectedShapes)
                {
                    if (sb.IsBackground)
                    {
                        continue;
                    }
                    movecount++;
                    sb.Move(dx, dy);
                }
                if (movecount > 0)
                {
                    drawArea.Document.ChangedService.MarkChanged();
                }

                drawArea.Cursor = Cursors.SizeAll;
                drawArea.Refresh();
            }

            if (selectMode == SelectionMode.NetSelection)
            {
                drawArea.NetRectangle = ShapeControlPaintNew.GetNormalizedRectangle(startPoint, lastPoint);
                drawArea.Refresh();
                return;
            }
        }