Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GrammaticalOptimization/DynamicDataDisplay/Charts/Navigation/LongOperationsIndicator.cs @ 12747

Last change on this file since 12747 was 12503, checked in by aballeit, 10 years ago

#2283 added GUI and charts; fixed MCTS

File size: 4.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows;
6using System.Windows.Controls;
7using System.Windows.Input;
8using System.Windows.Threading;
9
10namespace Microsoft.Research.DynamicDataDisplay.Charts.Navigation
11{
12    public sealed class LongOperationsIndicator : IPlotterElement
13    {
14        public LongOperationsIndicator()
15        {
16            timer.Tick += new EventHandler(timer_Tick);
17        }
18
19        private void timer_Tick(object sender, EventArgs e)
20        {
21            UpdateWaitIndicator();
22            timer.Stop();
23        }
24
25        #region IPlotterElement Members
26
27        void IPlotterElement.OnPlotterAttached(Plotter plotter)
28        {
29            this.plotter = plotter;
30        }
31
32        void IPlotterElement.OnPlotterDetaching(Plotter plotter)
33        {
34            this.plotter = null;
35        }
36
37        private Plotter plotter;
38        Plotter IPlotterElement.Plotter
39        {
40            get { return plotter; }
41        }
42
43        #endregion
44
45        #region LongOperationRunning
46
47        public static void BeginLongOperation(DependencyObject obj)
48        {
49            obj.SetValue(LongOperationRunningProperty, true);
50        }
51
52        public static void EndLongOperation(DependencyObject obj)
53        {
54            obj.SetValue(LongOperationRunningProperty, false);
55        }
56
57        public static bool GetLongOperationRunning(DependencyObject obj)
58        {
59            return (bool)obj.GetValue(LongOperationRunningProperty);
60        }
61
62        public static void SetLongOperationRunning(DependencyObject obj, bool value)
63        {
64            obj.SetValue(LongOperationRunningProperty, value);
65        }
66
67        public static readonly DependencyProperty LongOperationRunningProperty = DependencyProperty.RegisterAttached(
68          "LongOperationRunning",
69          typeof(bool),
70          typeof(LongOperationsIndicator),
71          new FrameworkPropertyMetadata(false, OnLongOperationRunningChanged));
72
73        private static void OnLongOperationRunningChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
74        {
75            Plotter plotter = null;
76            IPlotterElement element = d as IPlotterElement;
77            if (element == null)
78            {
79                plotter = Plotter.GetPlotter(d);
80            }
81            else
82            {
83                plotter = element.Plotter;
84            }
85
86            if (plotter != null)
87            {
88                var indicator = plotter.Children.OfType<LongOperationsIndicator>().FirstOrDefault();
89                if (indicator != null)
90                {
91                    indicator.OnLongOperationRunningChanged(element, (bool)e.NewValue);
92                }
93            }
94        }
95
96        UIElement indicator = LoadIndicator();
97
98        private static UIElement LoadIndicator()
99        {
100            var resources = (ResourceDictionary)Application.LoadComponent(new Uri("/DynamicDataDisplay;component/Charts/Navigation/LongOperationsIndicatorResources.xaml", UriKind.Relative));
101            UIElement indicator = (UIElement)resources["Indicator"];
102            return indicator;
103        }
104
105        private readonly DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
106        private int operationsCounter = 0;
107        private void OnLongOperationRunningChanged(IPlotterElement element, bool longOperationRunning)
108        {
109            int change = longOperationRunning ? +1 : -1;
110            operationsCounter += change;
111
112            if (plotter == null) return;
113
114            if (operationsCounter == 1)
115            {
116                timer.Start();
117            }
118            else if (operationsCounter == 0)
119            {
120                timer.Stop();
121                UpdateWaitIndicator();
122            }
123        }
124
125        private void UpdateWaitIndicator()
126        {
127            if (operationsCounter == 1)
128            {
129                if (!plotter.MainCanvas.Children.Contains(indicator))
130                {
131                    plotter.MainCanvas.Children.Add(indicator);
132                }
133                plotter.Cursor = Cursors.Wait;
134            }
135            else if (operationsCounter == 0)
136            {
137                plotter.MainCanvas.Children.Remove(indicator);
138                plotter.ClearValue(Plotter.CursorProperty);
139            }
140        }
141
142        #endregion // end of LongOperationRunning
143    }
144}
Note: See TracBrowser for help on using the repository browser.