protected static BaseAdornerLayout.LayoutCache GetCache(DependencyObject element)
 {
     BaseAdornerLayout.LayoutCache layoutCache = (BaseAdornerLayout.LayoutCache)element.GetValue(BaseAdornerLayout.CacheProperty);
     if (layoutCache == null)
     {
         layoutCache = new BaseAdornerLayout.LayoutCache();
         element.SetValue(BaseAdornerLayout.CacheProperty, (object)layoutCache);
     }
     return(layoutCache);
 }
        public override bool EvaluateLayout(DesignerView view, UIElement adorner)
        {
            BaseAdornerLayout.LayoutCache cache = BaseAdornerLayout.GetCache((DependencyObject)adorner);
            Matrix m1_1 = cache.ElementToDesignerViewTransformMatrix;
            Matrix m1_2 = cache.DesignerViewToViewportMatrix;
            bool   flag = base.EvaluateLayout(view, adorner);

            if (!MathUtilities.AreClose(m1_1, cache.ElementToDesignerViewTransformMatrix) || !MathUtilities.AreClose(m1_2, cache.DesignerViewToViewportMatrix))
            {
                this.SetupTransform(adorner);
            }
            return(flag);
        }
        private void SetupTransform(UIElement adorner)
        {
            BaseAdornerLayout.LayoutCache cache = BaseAdornerLayout.GetCache((DependencyObject)adorner);
            CanonicalTransform            canonicalTransform1 = new CanonicalTransform(cache.ElementToDesignerViewTransformMatrix);
            CanonicalTransform            canonicalTransform2 = new CanonicalTransform(cache.DesignerViewToViewportMatrix);
            Vector vector = VectorUtilities.Scale(canonicalTransform1.Scale, canonicalTransform2.Scale);

            adorner.SetValue(TransformAwareAdornerLayout.DesignerElementScalingFactorWithZoom, (object)vector);
            CanonicalTransform canonicalTransform3 = new CanonicalTransform(canonicalTransform1);

            canonicalTransform3.Scale = VectorUtilities.Unscale(new Vector((double)Math.Sign(vector.X), (double)Math.Sign(vector.Y)), canonicalTransform2.Scale);
            AdornerPanel adornerPanel = adorner as AdornerPanel;

            if (adornerPanel != null)
            {
                if (!adornerPanel.UseMirrorTransform)
                {
                    canonicalTransform3.Scale = VectorUtilities.Unscale(new Vector(1.0, 1.0), canonicalTransform2.Scale);
                }
                else
                {
                    adornerPanel.IsMirroredTransform = vector.X < 0.0;
                }
            }
            Transform renderTransform = AdornerProperties.GetRenderTransform((DependencyObject)adorner);
            Transform transform       = (Transform)canonicalTransform3.ToTransform();

            if (renderTransform != null)
            {
                transform = (Transform) new TransformGroup()
                {
                    Children =
                    {
                        transform,
                        renderTransform
                    }
                }
            }
            ;
            adorner.RenderTransform = transform;
        }
        private static void EnsureActualValues(DependencyObject adorner)
        {
            ViewItem  view  = AdornerProperties.GetView(adorner);
            ModelItem model = AdornerProperties.GetModel(adorner);

            BaseAdornerLayout.LayoutCache cache = BaseAdornerLayout.GetCache(adorner);
            if (cache.Model == model && !(cache.View != view))
            {
                return;
            }
            if (cache.Model != null)
            {
                cache.Model.PropertyChanged -= new PropertyChangedEventHandler(BaseAdornerLayout.OnModelItemPropertyChanged);
            }
            cache.Model = model;
            cache.View  = view;
            if (model == null)
            {
                return;
            }
            model.PropertyChanged += new PropertyChangedEventHandler(BaseAdornerLayout.OnModelItemPropertyChanged);
        }
        public override void Arrange(UIElement adorner)
        {
            BaseAdornerLayout.LayoutCache cache = BaseAdornerLayout.GetCache((DependencyObject)adorner);
            Matrix m1_1 = cache.ElementToDesignerViewTransformMatrix;
            Matrix m1_2 = cache.DesignerViewToViewportMatrix;

            if (!MathUtilities.AreClose(m1_1, cache.ElementToDesignerViewTransformMatrix) || !MathUtilities.AreClose(m1_2, cache.DesignerViewToViewportMatrix))
            {
                this.SetupTransform(adorner);
            }
            Vector   scale = (Vector)adorner.GetValue(TransformAwareAdornerLayout.DesignerElementScalingFactorWithZoom);
            ViewItem view  = AdornerProperties.GetView((DependencyObject)adorner);

            this.SetAdornerBounds(adorner, view, new Point(0.0, 0.0), scale);
            if (!(view != (ViewItem)null) || cache.PlatformObjectHashCode == 0 || cache.PlatformObjectHashCode == view.PlatformObject.GetHashCode())
            {
                return;
            }
            cache.View                   = view;
            cache.RenderSize             = view.RenderSize;
            cache.PlatformObjectHashCode = view.PlatformObject.GetHashCode();
        }
        private static void CheckAndInvalidateAdorner(DesignerView view, ViewItem element, UIElement adorner)
        {
            if (view.Context == null)
            {
                return;
            }
            Matrix m1 = TransformUtil.GetTransformToImmediateParent((DependencyObject)view).Value;
            Matrix identity;
            Size   s1;

            if (element != (ViewItem)null)
            {
                identity = TransformUtil.GetSelectionFrameTransformToDesignerView(view.Context, element).Value;
                s1       = element.RenderSize;
            }
            else
            {
                identity = Matrix.Identity;
                s1       = Size.Empty;
            }
            BaseAdornerLayout.LayoutCache cache = BaseAdornerLayout.GetCache((DependencyObject)adorner);
            bool flag1 = false;
            bool flag2 = false;
            bool flag3 = false;

            if (element != (ViewItem)null && !MathUtilities.AreClose(s1, cache.RenderSize))
            {
                flag1 = true;
            }
            if (element != (ViewItem)null && !MathUtilities.AreClose(identity, cache.ElementToDesignerViewTransformMatrix))
            {
                flag1 = true;
                flag2 = true;
            }
            if (!MathUtilities.AreClose(m1, cache.DesignerViewToViewportMatrix))
            {
                flag1 = true;
                flag2 = true;
            }
            if (element != (ViewItem)null && !element.IsVisible)
            {
                ViewItem view1 = view.Context.Services.GetRequiredService <ModelService>().Root.View;
                for (ViewItem viewItem = element; viewItem != view1 && viewItem != (ViewItem)null; viewItem = viewItem.VisualParent)
                {
                    if (viewItem.Visibility == Visibility.Collapsed)
                    {
                        flag3 = true;
                        break;
                    }
                }
            }
            if (flag3)
            {
                object obj = adorner.ReadLocalValue(UIElement.VisibilityProperty);
                if (adorner.ReadLocalValue(BaseAdornerLayout.CachedVisibilityProperty) == DependencyProperty.UnsetValue)
                {
                    if (obj != DependencyProperty.UnsetValue)
                    {
                        adorner.SetValue(BaseAdornerLayout.CachedVisibilityProperty, obj);
                    }
                    else
                    {
                        adorner.SetValue(BaseAdornerLayout.CachedVisibilityProperty, (object)Visibility.Visible);
                    }
                    adorner.Visibility = Visibility.Collapsed;
                }
            }
            else
            {
                object obj = adorner.ReadLocalValue(BaseAdornerLayout.CachedVisibilityProperty);
                if (obj != DependencyProperty.UnsetValue)
                {
                    adorner.SetValue(UIElement.VisibilityProperty, obj);
                }
                adorner.ClearValue(BaseAdornerLayout.CachedVisibilityProperty);
            }
            if (!flag1 && !flag2)
            {
                return;
            }
            if (element != (ViewItem)null)
            {
                cache.RenderSize = s1;
                cache.ElementToDesignerViewTransformMatrix = identity;
                cache.PlatformObjectHashCode = element.PlatformObject.GetHashCode();
            }
            cache.DesignerViewToViewportMatrix = m1;
            cache.DesignerView = view;
            UIElement uiElement = VisualTreeHelper.GetParent((DependencyObject)adorner) as UIElement;

            if (flag1)
            {
                adorner.InvalidateMeasure();
                if (uiElement != null)
                {
                    uiElement.InvalidateMeasure();
                }
            }
            if (!flag2)
            {
                return;
            }
            adorner.InvalidateVisual();
            if (uiElement == null)
            {
                return;
            }
            uiElement.InvalidateVisual();
        }