void LineAdorner_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (!IsControlModeOn)
            {
                if (this.IsMouseCaptured)
                {
                    CustomLineElement line     = this.AdornedElement as CustomLineElement;
                    LineLogicItem     lineItem = line.DataContext as LineLogicItem;
                    Point             p        = SnapGrid.Snap(e.GetPosition(line), gridSize, GridOffsetLeft, GridOffsetTop);

                    if (IsStartPoint)
                    {
                        lineItem.X1 = p.X;
                        lineItem.Y1 = p.Y;
                    }
                    else
                    {
                        lineItem.X2 = p.X;
                        lineItem.Y2 = p.Y;
                    }

                    // update line item modification flag
                    //if (originalLineItem.CheckForModification(lineItem))
                    //    lineItem.IsModified = true;

                    this.InvalidateVisual();
                    this.ReleaseMouseCapture();
                    this.Cursor = Cursors.Arrow;
                }
            }
        }
        void LineAdorner_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.IsMouseCaptured)
            {
                if (this.AdornedElement.GetType() == typeof(CustomLineElement))
                {
                    CustomLineElement line     = this.AdornedElement as CustomLineElement;
                    LineLogicItem     lineItem = line.DataContext as LineLogicItem;

                    Point p = SnapGrid.Snap(e.GetPosition(line), gridSize, GridOffsetLeft, GridOffsetTop);

                    // edit mode: move line start point OR move line end point
                    if (mode == LineAdornerMode.Edit)
                    {
                        if (IsStartPoint)
                        {
                            lineItem.X1 = p.X;
                            lineItem.Y1 = p.Y;
                        }
                        else
                        {
                            lineItem.X2 = p.X;
                            lineItem.Y2 = p.Y;
                        }
                    }

                    // move mode: move line start point AND move line end point

                    if (mode == LineAdornerMode.Move)
                    {
                        if (IsStartPoint)
                        {
                            double dX   = lineItem.X1 - p.X;
                            double dY   = lineItem.Y1 - p.Y;
                            Point  pEnd = new Point(lineItem.X2 - dX, lineItem.Y2 - dY);

                            lineItem.X1 = p.X;
                            lineItem.Y1 = p.Y;
                            lineItem.X2 = pEnd.X;
                            lineItem.Y2 = pEnd.Y;
                        }
                        else
                        {
                            double dX     = lineItem.X2 - p.X;
                            double dY     = lineItem.Y2 - p.Y;
                            Point  pStart = new Point(lineItem.X1 - dX, lineItem.Y1 - dY);

                            lineItem.X2 = p.X;
                            lineItem.Y2 = p.Y;
                            lineItem.X1 = pStart.X;
                            lineItem.Y1 = pStart.Y;
                        }
                    }

                    this.InvalidateVisual();
                }
            }
        }
        //static Pen penGuide = new Pen(new SolidColorBrush(Color.FromArgb(128, 255, 127, 0)), 1.0);

        protected override void OnRender(DrawingContext drawingContext)
        {
            if (this.AdornedElement.GetType() == typeof(CustomLineElement))
            {
                CustomLineElement line     = this.AdornedElement as CustomLineElement;
                LineLogicItem     lineItem = line.DataContext as LineLogicItem;

                Canvas c = FindVisualParent <Canvas>(line);
                double w = c.Width;
                double h = c.Height;

                // draw guide lines
                if (this.IsMouseCaptured)
                {
                    /*
                     * double halfPenWidthGuide = penGuide.Thickness / 2;
                     *
                     * // horizontal guide
                     * Point h0 = new Point(0, IsStartPoint ? lineItem.Y1 : lineItem.Y2);
                     * Point h1 = new Point(w, IsStartPoint ? lineItem.Y1 : lineItem.Y2);
                     *
                     * // vertical guide
                     * Point v0 = new Point(IsStartPoint ? lineItem.X1 : lineItem.X2, 0);
                     * Point v1 = new Point(IsStartPoint ? lineItem.X1 : lineItem.X2, h);
                     *
                     * // draw lines
                     * GuidelineSet gg1 = new GuidelineSet();
                     * gg1.GuidelinesX.Add(h0.X + halfPenWidthGuide);
                     * gg1.GuidelinesX.Add(h1.X + halfPenWidthGuide);
                     * gg1.GuidelinesY.Add(h0.Y + halfPenWidthGuide);
                     * gg1.GuidelinesY.Add(h1.Y + halfPenWidthGuide);
                     * drawingContext.PushGuidelineSet(gg1);
                     *
                     * drawingContext.DrawLine(penGuide, h0, h1);
                     * drawingContext.Pop();
                     *
                     * GuidelineSet gg2 = new GuidelineSet();
                     * gg2.GuidelinesX.Add(v0.X + halfPenWidthGuide);
                     * gg2.GuidelinesX.Add(v1.X + halfPenWidthGuide);
                     * gg2.GuidelinesY.Add(v0.Y + halfPenWidthGuide);
                     * gg2.GuidelinesY.Add(v1.Y + halfPenWidthGuide);
                     * drawingContext.PushGuidelineSet(gg2);
                     *
                     * drawingContext.DrawLine(penGuide, v0, v1);
                     * drawingContext.Pop();
                     */
                }

                double halfPenWidth = pen.Thickness / 2;

                //Point p1 = new Point(lineItem.X1, lineItem.Y1);
                //Point p2 = new Point(lineItem.X2, lineItem.Y2);

                Point p1 = new Point(line.X1, line.Y1);
                Point p2 = new Point(line.X2, line.Y2);

                p1.Offset(-size.Width / 2, -size.Height / 2);
                p2.Offset(-size.Width / 2, -size.Height / 2);

                Rect r1 = new Rect(p1, size);
                Rect r2 = new Rect(p2, size);

                GuidelineSet g1 = new GuidelineSet();
                g1.GuidelinesX.Add(r1.Left + halfPenWidth);
                g1.GuidelinesX.Add(r1.Right + halfPenWidth);
                g1.GuidelinesY.Add(r1.Top + halfPenWidth);
                g1.GuidelinesY.Add(r1.Bottom + halfPenWidth);
                drawingContext.PushGuidelineSet(g1);

                drawingContext.DrawRectangle(brush, pen, r1);
                drawingContext.Pop();

                GuidelineSet g2 = new GuidelineSet();
                g2.GuidelinesX.Add(r2.Left + halfPenWidth);
                g2.GuidelinesX.Add(r2.Right + halfPenWidth);
                g2.GuidelinesY.Add(r2.Top + halfPenWidth);
                g2.GuidelinesY.Add(r2.Bottom + halfPenWidth);
                drawingContext.PushGuidelineSet(g2);

                drawingContext.DrawRectangle(brush, pen, r2);
                drawingContext.Pop();
            }

            base.OnRender(drawingContext);
        }
        void LineAdorner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control)
            {
                IsControlModeOn = true;
            }

            CustomLineElement line     = this.AdornedElement as CustomLineElement;
            LineLogicItem     lineItem = line.DataContext as LineLogicItem;
            Point             p        = SnapGrid.Snap(e.GetPosition(line), GridSize, GridOffsetLeft, GridOffsetTop);

            double dStart = 0.0;
            double dEnd   = 0.0;

            if (!this.IsMouseCaptured)
            {
                // copy original coordinates
                originalLineItem = new LineLogicItem()
                {
                    X1 = lineItem.X1,
                    Y1 = lineItem.Y1,
                    X2 = lineItem.X2,
                    Y2 = lineItem.Y2
                };

                // calculate start/end point coordinates
                dStart = Math.Sqrt(Math.Pow(lineItem.X1 - p.X, 2) + Math.Pow(lineItem.Y1 - p.Y, 2));
                dEnd   = Math.Sqrt(Math.Pow(lineItem.X2 - p.X, 2) + Math.Pow(lineItem.Y2 - p.Y, 2));
            }

            if (IsControlModeOn)
            {
                if (this.IsMouseCaptured)
                {
                    if (IsStartPoint)
                    {
                        lineItem.X1 = p.X;
                        lineItem.Y1 = p.Y;
                    }
                    else
                    {
                        lineItem.X2 = p.X;
                        lineItem.Y2 = p.Y;
                    }

                    this.InvalidateVisual();
                    this.ReleaseMouseCapture();

                    IsControlModeOn = false;
                }
                else
                {
                    IsStartPoint = dStart < dEnd ? true : false;
                    this.Cursor  = Cursors.Hand;
                    this.InvalidateVisual();
                    this.CaptureMouse();
                }
            }
            else
            {
                if (!this.IsMouseCaptured)
                {
                    IsStartPoint = dStart < dEnd ? true : false;
                    this.Cursor  = Cursors.Hand;
                    this.InvalidateVisual();
                    this.CaptureMouse();
                }
            }
        }
Esempio n. 5
0
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            if (this.DataContext is PageItem)
            {
                //if (Keyboard.Modifiers == ModifierKeys.Control)
                //    IsControlModeOn = true;

                /*
                 * PageItem Page = this.DataContext as PageItem;
                 * Point p = GetClickLocation(e.GetPosition(this), GridOffsetLeft, GridOffsetTop);
                 * Page.Items.Add(new AndGateLogicItem()
                 * {
                 *  IsNew = true,
                 *  IsModified = false,
                 *  IsDeleted = false,
                 *  X = p.X,
                 *  Y = p.Y,
                 *  Z = 1
                 * });
                 */

                PageItem Page = this.DataContext as PageItem;
                Page.SelectedItem = null;

                Point p = SnapGrid.Snap(e.GetPosition(this), GridSize, GridOffsetLeft, GridOffsetTop);
                if (this.IsMouseCaptured)
                {
                    //currentLineItem.X2 = p.X;
                    //currentLineItem.Y2 = p.Y;
                    //c.ReleaseMouseCapture();
                }
                else
                {
                    Point pHit = e.GetPosition(this);

                    CustomLineElement lineHit = null;
                    HitTestResult     result  = VisualTreeHelper.HitTest(this, pHit);
                    if (result != null)
                    {
                        if (result.VisualHit.GetType() == typeof(CustomLineElement))
                        {
                            lineHit = result.VisualHit as CustomLineElement;
                        }
                    }

                    if (lineHit == null && selectedLine == null)
                    {
                        currentLineItem = new LineLogicItem()
                        {
                            IsNew      = false,
                            IsModified = false,
                            IsDeleted  = false,
                            X1         = p.X,
                            Y1         = p.Y,
                            X2         = p.X,
                            Y2         = p.Y,
                            Z          = 0
                        };

                        Page.Items.Add(currentLineItem);
                        this.CaptureMouse();
                    }

                    if (lineHit != selectedLine && selectedLine != null)
                    {
                        if (Keyboard.Modifiers != ModifierKeys.Control)
                        {
                            var LineAdornerLayer = AdornerLayer.GetAdornerLayer(selectedLine);
                            if (LineAdornerLayer != null)
                            {
                                LineAdornerLayer.Remove(LineAdornerLayer.GetAdorners(selectedLine)[0]);
                            }

                            selectedLine = null;
                        }
                    }

                    if (lineHit != null && lineHit != selectedLine)
                    {
                        selectedLine = lineHit;
                        var LineAdornerLayer = AdornerLayer.GetAdornerLayer(lineHit);

                        if (LineAdornerLayer != null)
                        {
                            LineAdornerLayer.Add(new LineAdorner(lineHit));
                        }
                    }

                    //currentLineItem = new LineLogicItem() { X1 = p.X, Y1 = p.Y, X2 = p.X, Y2 = p.Y, Z = 0 };
                    //Page.Items.Add(currentLineItem);
                    //c.CaptureMouse();
                }
            }
        }