예제 #1
0
        /// <summary>
        /// Private helper that takes an element and transforms it's 4 points
        /// into the InkCanvas's space
        /// </summary>
        private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement)
        {
            Debug.Assert(canvas != null);
            Debug.Assert(childElement != null);

            Debug.Assert(canvas.CheckAccess());

            ElementCornerPoints elementPoints = new ElementCornerPoints();

            elementPoints.Set = false;

            if (childElement.Visibility != Visibility.Visible)
            {
                //
                // this little one's not worth it...
                //
                return(elementPoints);
            }

            //
            // get the transform from us to our parent InkCavas
            //
            GeneralTransform parentTransform = childElement.TransformToAncestor(canvas);

            //

            parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft);
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight);
            parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft);
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight);

            elementPoints.Set = true;
            return(elementPoints);
        }
예제 #2
0
        /// <summary>
        /// Private helper that will generate a grid of points 5 px apart given the elements bounding points
        /// this works with any affline transformed points
        /// </summary>
        private Point[] GeneratePointGrid(ElementCornerPoints elementPoints)
        {
            if (!elementPoints.Set)
            {
                return(new Point[] {});
            }
            ArrayList pointArray = new ArrayList();

            UpdatePointDistances(elementPoints);

            //
            // add our original points
            //
            pointArray.Add(elementPoints.UpperLeft);
            pointArray.Add(elementPoints.UpperRight);
            FillInPoints(pointArray, elementPoints.UpperLeft, elementPoints.UpperRight);

            pointArray.Add(elementPoints.LowerLeft);
            pointArray.Add(elementPoints.LowerRight);
            FillInPoints(pointArray, elementPoints.LowerLeft, elementPoints.LowerRight);

            FillInGrid(pointArray,
                       elementPoints.UpperLeft,
                       elementPoints.UpperRight,
                       elementPoints.LowerRight,
                       elementPoints.LowerLeft);

            Point[] retPointArray = new Point[pointArray.Count];
            pointArray.CopyTo(retPointArray);
            return(retPointArray);
        }
예제 #3
0
        /// <summary>
        /// Private helper that takes an element and transforms it's 4 points
        /// into the InkCanvas's space
        /// </summary>
        private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement)
        {
            Debug.Assert(canvas != null);
            Debug.Assert(childElement != null);

            Debug.Assert(canvas.CheckAccess());

            ElementCornerPoints elementPoints = new ElementCornerPoints();

            elementPoints.Set = false;

            if (childElement.Visibility != Visibility.Visible)
            {
                //
                // this little one's not worth it...
                //
                return(elementPoints);
            }

            //
            // get the transform from us to our parent InkCavas
            //
            GeneralTransform parentTransform = childElement.TransformToAncestor(canvas);

            // REVIEW: any of the methods below may not actually perform the transformation
            // Do we need to do anything special in that scenario?
            parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft);
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight);
            parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft);
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight);

            elementPoints.Set = true;
            return(elementPoints);
        }
예제 #4
0
        /// <summary>
        /// Private helper that will turn an element in any nesting level into a stroke
        /// in the InkCanvas's coordinate space.  This method calls itself recursively
        /// </summary>
        private void HitTestElement(InkCanvasInnerCanvas parent, UIElement uiElement, List <UIElement> elementsToSelect)
        {
            ElementCornerPoints elementPoints = LassoSelectionBehavior.GetTransformedElementCornerPoints(parent, uiElement);

            if (elementPoints.Set != false)
            {
                Point[] points = GeneratePointGrid(elementPoints);

                //
                // perform hit testing against our lasso
                //
                System.Diagnostics.Debug.Assert(null != _lassoHelper);
                if (_lassoHelper.ArePointsInLasso(points, _percentIntersectForElements))
                {
                    elementsToSelect.Add(uiElement);
                }
            }
            //
            // we used to recurse into the childrens children.  That is no longer necessary
            //
        }
예제 #5
0
        /// <summary>
        /// Used to calc the diff between points on the x and y axis
        /// </summary>
        private void UpdatePointDistances(ElementCornerPoints elementPoints)
        {
            //
            // calc the x and y diffs
            //
            double width = elementPoints.UpperLeft.X - elementPoints.UpperRight.X;

            if (width < 0)
            {
                width = -width;
            }

            double height = elementPoints.UpperLeft.Y - elementPoints.LowerLeft.Y;

            if (height < 0)
            {
                height = -height;
            }

            _xDiff = width * 0.25f;
            if (_xDiff > _maxThreshold)
            {
                _xDiff = _maxThreshold;
            }
            else if (_xDiff < _minThreshold)
            {
                _xDiff = _minThreshold;
            }

            _yDiff = height * 0.25f;
            if (_yDiff > _maxThreshold)
            {
                _yDiff = _maxThreshold;
            }
            else if (_yDiff < _minThreshold)
            {
                _yDiff = _minThreshold;
            }
        }
예제 #6
0
        /// <summary>
        /// Used to calc the diff between points on the x and y axis
        /// </summary> 
        private void UpdatePointDistances(ElementCornerPoints elementPoints)
        { 
            // 
            // calc the x and y diffs
            // 
            double width = elementPoints.UpperLeft.X - elementPoints.UpperRight.X;
            if (width < 0)
            {
                width = -width; 
            }
 
            double height = elementPoints.UpperLeft.Y - elementPoints.LowerLeft.Y; 
            if (height < 0)
            { 
                height = -height;
            }

            _xDiff = width * 0.25f; 
            if (_xDiff > _maxThreshold)
            { 
                _xDiff = _maxThreshold; 
            }
            else if (_xDiff < _minThreshold) 
            {
                _xDiff = _minThreshold;
            }
 
            _yDiff = height * 0.25f;
            if (_yDiff > _maxThreshold) 
            { 
                _yDiff = _maxThreshold;
            } 
            else if (_yDiff < _minThreshold)
            {
                _yDiff = _minThreshold;
            } 
        }
예제 #7
0
        /// <summary> 
        /// Private helper that will generate a grid of points 5 px apart given the elements bounding points
        /// this works with any affline transformed points 
        /// </summary> 
        private Point[] GeneratePointGrid(ElementCornerPoints elementPoints)
        { 
            if (!elementPoints.Set)
            {
                return new Point[]{};
            } 
            ArrayList pointArray = new ArrayList();
 
            UpdatePointDistances(elementPoints); 

            // 
            // add our original points
            //
            pointArray.Add(elementPoints.UpperLeft);
            pointArray.Add(elementPoints.UpperRight); 
            FillInPoints(pointArray, elementPoints.UpperLeft, elementPoints.UpperRight);
 
            pointArray.Add(elementPoints.LowerLeft); 
            pointArray.Add(elementPoints.LowerRight);
            FillInPoints(pointArray, elementPoints.LowerLeft, elementPoints.LowerRight); 

            FillInGrid( pointArray,
                        elementPoints.UpperLeft,
                        elementPoints.UpperRight, 
                        elementPoints.LowerRight,
                        elementPoints.LowerLeft); 
 
            Point[] retPointArray = new Point[pointArray.Count];
            pointArray.CopyTo(retPointArray); 
            return retPointArray;
        }
예제 #8
0
        /// <summary>
        /// Private helper that takes an element and transforms it's 4 points
        /// into the InkCanvas's space 
        /// </summary>
        private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement) 
        { 
            Debug.Assert(canvas != null);
            Debug.Assert(childElement != null); 

            Debug.Assert(canvas.CheckAccess());

            ElementCornerPoints elementPoints = new ElementCornerPoints(); 
            elementPoints.Set = false;
 
            if (childElement.Visibility != Visibility.Visible) 
            {
                // 
                // this little one's not worth it...
                //
                return elementPoints;
            } 

            // 
            // get the transform from us to our parent InkCavas 
            //
            GeneralTransform parentTransform = childElement.TransformToAncestor(canvas); 

            //

            parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft); 
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight);
            parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft); 
            parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight); 

            elementPoints.Set = true; 
            return elementPoints;
        }