source: trunk/CrypPlugins/WorkspaceManager/View/VisualComponents/ModifiedCanvas/ModifiedCanvas.cs

Last change on this file was 8109, checked in by kopal, 2 years ago
  • removed all unused references from all source code files
File size: 5.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Windows.Controls;
5using System.Windows;
6using WorkspaceManager.View.Visuals;
7using WorkspaceManager.View.Base.Interfaces;
8
9namespace WorkspaceManager.View.VisualComponents
10{
11    public class ModifiedCanvas : Canvas
12    {
13        public enum ZPaneRequest
14        {
15            top,
16            bot,
17            up,
18            down
19        };
20
21        private LinkedList<IZOrdering> zPaneOrderCollection = new LinkedList<IZOrdering>();
22
23        protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
24        {
25            base.OnVisualChildrenChanged(visualAdded, visualRemoved);
26            if (visualAdded is IRouting)
27            {
28                var bin = (IRouting)visualAdded;
29                bin.PositionDeltaChanged += new EventHandler<PositionDeltaChangedArgs>(PositionDeltaChanged);
30            }
31            if (visualRemoved is IRouting)
32            {
33                var bin = (IRouting)visualRemoved;
34                bin.PositionDeltaChanged -= new EventHandler<PositionDeltaChangedArgs>(PositionDeltaChanged);
35            }
36
37            if (visualAdded is IZOrdering)
38            {
39                var bin = (IZOrdering)visualAdded;
40                zPaneOrderCollection.AddLast(bin);
41                //zPaneOrderCollection = new LinkedList<IZOrdering>(zPaneOrderCollection.OrderBy(x => x.ZIndex));
42
43            }
44            if (visualRemoved is IZOrdering)
45            {
46                var bin = (IZOrdering)visualRemoved;
47                zPaneOrderCollection.Remove(bin);
48                //zPaneOrderCollection = new LinkedList<IZOrdering>(zPaneOrderCollection.OrderBy(x => x.ZIndex));
49            }
50        }
51
52        void PositionDeltaChanged(object sender, PositionDeltaChangedArgs e)
53        {
54            this.InvalidateMeasure();
55            //foreach (CryptoLineView.CryptoLineView element in base.InternalChildren.OfType<CryptoLineView.CryptoLineView>())
56            //{
57            //    element.Line.InvalidateVisual();
58            //}
59        }
60
61        public static void RequestZIndexModification(ModifiedCanvas panel,IZOrdering obj, ZPaneRequest req)
62        {
63            if (panel == null || panel.zPaneOrderCollection.Find(obj) == null)
64                return;
65            var node = panel.zPaneOrderCollection.Find(obj);
66            var next = node.Next;
67            var prev = node.Previous;
68            panel.zPaneOrderCollection.Remove(obj);
69            switch (req)
70            {
71                case ZPaneRequest.bot:
72                    panel.zPaneOrderCollection.AddFirst(obj);
73                    break;
74
75                case ZPaneRequest.top:
76                    panel.zPaneOrderCollection.AddLast(obj);
77                    break;
78
79                case ZPaneRequest.up:
80                    if (next != null)
81                        panel.zPaneOrderCollection.AddAfter(next, node);
82                    else
83                        panel.zPaneOrderCollection.AddLast(obj);
84                    break;
85
86                case ZPaneRequest.down:
87                    if (prev != null)
88                        panel.zPaneOrderCollection.AddBefore(prev, node);
89                    else
90                        panel.zPaneOrderCollection.AddFirst(obj);
91                    break;
92            }
93
94            panel.InvalidateMeasure();
95        }
96
97        protected override Size MeasureOverride(Size constraint)
98        {
99            base.MeasureOverride(constraint);
100            Size availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
101            double maxHeight = 0;
102            double maxWidth = 0;
103            double left;
104            double top;
105
106            foreach (UIElement element in base.InternalChildren)
107            {
108                if (element != null)
109                {
110                    element.Measure(availableSize);
111                    if (element is IRouting)
112                    {
113                        IRouting b = (IRouting)element;
114
115                        left = b.Position.X;
116                        top = b.Position.Y;
117                        left += element.DesiredSize.Width;
118                        top += element.DesiredSize.Height;
119
120                        maxWidth = maxWidth < left ? left : maxWidth;
121                        maxHeight = maxHeight < top ? top : maxHeight;
122
123                        if (element is TextVisual || element is ImageVisual)
124                            Canvas.SetZIndex(element, -2);
125                    }
126                    else
127                    {
128                        left = element.DesiredSize.Width;
129                        top = element.DesiredSize.Height;
130                        maxWidth = maxWidth < left ? left : maxWidth;
131                        maxHeight = maxHeight < top ? top : maxHeight;
132                    }
133                    //element.InvalidateArrange();
134                }
135            }
136
137            //Possible performance improvement
138            var list = zPaneOrderCollection.ToList();
139            foreach (var order in list)
140            {
141                int i = order.ZIndex = list.IndexOf(order);
142                Panel.SetZIndex((UIElement)order, i);
143            }
144
145            return new Size { Height = maxHeight, Width = maxWidth };
146        }
147    }
148}
Note: See TracBrowser for help on using the repository browser.