source: trunk/CrypPlugins/WorkspaceManager/View/Container/PluginContainerView.xaml.cs @ 1838

Last change on this file since 1838 was 1838, checked in by matkovic, 11 years ago

-small changes

File size: 24.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.Data;
8using System.Windows.Documents;
9using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Media.Imaging;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14using WorkspaceManager.View.Interface;
15using WorkspaceManager.Model;
16using WorkspaceManager.View.VisualComponents;
17using System.Windows.Controls.Primitives;
18using System.Windows.Media.Animation;
19using WorkspaceManager;
20using System.Windows.Threading;
21using System.Threading;
22
23namespace WorkspaceManager.View.Container
24{
25    public enum PluginViewState
26    {   
27        Min,
28        Presentation,
29        Data,
30        Log,
31        Setting
32    };
33
34    /// <summary>
35    /// Interaction logic for PluginContainerView.xaml
36    /// </summary>
37    public partial class PluginContainerView : UserControl, IDraggable, IUpdateableView
38    {
39        #region Events
40        public event EventHandler<ConnectorViewEventArgs> ConnectorMouseLeftButtonDown;
41        public event EventHandler<PluginContainerViewDeleteViewEventArgs> Delete;
42        public event EventHandler<PluginContainerViewFullScreenViewEventArgs> FullScreen;
43        #endregion
44
45        #region Private Variables
46
47        private List<UIElement> optionList = new List<UIElement>();
48        private int optionPointer = 0;
49
50        #endregion
51
52        #region Properties
53
54        public static readonly DependencyProperty ViewStateProperty = DependencyProperty.Register("ViewState", typeof(PluginViewState), typeof(PluginContainerView), new FrameworkPropertyMetadata(PluginViewState.Min));
55
56
57        public PluginViewState ViewState
58        {
59            get 
60            {
61                return (PluginViewState)base.GetValue(ViewStateProperty);
62            }
63            set
64            {
65                if((PluginViewState)value != PluginViewState.Min)
66                {
67                    BottomDelta.IsEnabled = true;
68                    RightDelta.IsEnabled = true;
69                    BottomRightDelta.IsEnabled = true;
70                }
71                else
72                {
73                    BottomDelta.IsEnabled = false;
74                    RightDelta.IsEnabled = false;
75                    BottomRightDelta.IsEnabled = false;
76                }
77                base.SetValue(ViewStateProperty, value);
78            }
79        }
80
81        private Image icon;
82        public Image Icon
83        {
84            get
85            {
86                return icon;
87            }
88            set
89            {
90                icon = value;
91                icon.Stretch = Stretch.Uniform;
92                icon.Width = 40;
93                icon.Height = 40;
94            }
95        }
96
97        private List<ConnectorView> connectorViewList;
98        public List<ConnectorView> ConnectorViewList
99        {
100            get { return connectorViewList; }
101            private set { connectorViewList = value; }
102        }
103
104        private PluginModel model;
105        public PluginModel Model
106        {
107            get { return model; }
108            private set { model = value; }
109        }
110
111        public bool CanDrag { get; set; }
112
113        #endregion
114
115        #region Contructors
116        public PluginContainerView()
117        {
118            InitializeComponent();
119        }
120
121        public PluginContainerView(PluginModel model)
122        {
123            setBaseControl(model);
124            InitializeComponent();
125            DataContext = this;
126
127            switch (ViewState)
128            {
129                case PluginViewState.Min:
130                    IconPanel.Child = Icon;
131                    break;
132
133                case PluginViewState.Data:
134
135                    break;
136
137                case PluginViewState.Presentation:
138
139                    break;
140
141                case PluginViewState.Setting:
142
143                    break;
144
145                case PluginViewState.Log:
146
147                    break;
148            }
149
150            West.PreviewDrop += new DragEventHandler(Connector_Drop);
151            East.PreviewDrop += new DragEventHandler(Connector_Drop);
152            North.PreviewDrop += new DragEventHandler(Connector_Drop);
153            South.PreviewDrop += new DragEventHandler(Connector_Drop);
154
155            LogPanel.Child = new LogPresentation();
156            PresentationPanel.Child = Model.PluginPresentation;
157            SettingsPanel.Child = null;
158
159            foreach (ConnectorModel ConnectorModel in model.InputConnectors)
160            {
161                ConnectorView connector = new ConnectorView(ConnectorModel);
162                AddConnectorView(connector);
163                DataPanel.Children.Add(new DataPresentation(connector));
164            }
165
166            foreach (ConnectorModel ConnectorModel in model.OutputConnectors)
167            {
168                ConnectorView connector = new ConnectorView(ConnectorModel);
169                AddConnectorView(connector);
170                DataPanel.Children.Add(new DataPresentation(connector));
171            }
172        }
173
174        void Connector_Drop(object sender, DragEventArgs e)
175        {
176            StackPanel panel = sender as StackPanel;
177            if (e.Data.GetDataPresent("connector"))
178            {
179                ConnectorView connector = e.Data.GetData("connector") as ConnectorView;
180                if (panel.Children.Contains(connector))
181                    return;
182
183                switch (connector.Orientation)
184                {
185                    case ConnectorOrientation.West:
186                        this.West.Children.Remove(connector);
187                        break;
188                    case ConnectorOrientation.East:
189                        this.East.Children.Remove(connector);
190                        break;
191                    case ConnectorOrientation.North:
192                        this.North.Children.Remove(connector);
193                        break;
194                    case ConnectorOrientation.South:
195                        this.South.Children.Remove(connector);
196                        break;
197                }
198
199                switch (panel.Name)
200                {
201                    case "West":
202                        connector.Orientation = ConnectorOrientation.West;
203                        this.West.Children.Add(connector);
204                        break;
205                    case "East":
206                        connector.Orientation = ConnectorOrientation.East;
207                        this.East.Children.Add(connector);
208                        break;
209                    case "North":
210                        connector.Orientation = ConnectorOrientation.North;
211                        this.North.Children.Add(connector);
212                        break;
213                    case "South":
214                        connector.Orientation = ConnectorOrientation.South;
215                        this.South.Children.Add(connector);
216                        break;
217                }
218
219                SetAllConnectorPositionX();
220                e.Handled = true;
221            }
222        }
223
224        #endregion
225
226        #region Public Methods
227        public void AddConnectorView(ConnectorView connector)
228        {
229            switch (connector.Orientation)
230            {
231                case ConnectorOrientation.West:
232                    this.West.Children.Add(connector);
233                    break;
234                case ConnectorOrientation.East:
235                    this.East.Children.Add(connector);
236                    break;
237                case ConnectorOrientation.North:
238                    this.North.Children.Add(connector);
239                    break;
240                case ConnectorOrientation.South:
241                    this.South.Children.Add(connector);
242                    break;
243            }
244
245            connector.OnConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(connector_OnConnectorMouseLeftButtonDown);
246            connectorViewList.Add(connector);
247        }
248
249
250
251        public void ResetPopUp()
252        {
253            Random random = new Random();
254            BubblePopup.PlacementRectangle = new Rect(new Point(random.NextDouble() / 1000, 0), new Size(0, 0));
255            //ProgressPopup.PlacementRectangle = new Rect(new Point(random.NextDouble() / 1000, 0), new Size(0, 0));
256        }
257
258        public void SetPosition(Point value)
259        {
260            TranslateTransform pos = (this.RenderTransform as TranslateTransform);
261            pos.X = value.X;
262            pos.Y = value.Y;
263            ResetPopUp();
264            Model.Position = new Point(pos.X, pos.Y);
265            SetAllConnectorPositionX();
266        }
267
268        public Point GetPosition()
269        {
270            return new Point((this.RenderTransform as TranslateTransform).X, (this.RenderTransform as TranslateTransform).Y);
271        }
272
273        #endregion
274
275        #region Private Methods
276
277        private void setBaseControl(PluginModel model)
278        {
279            this.Loaded += new RoutedEventHandler(PluginContainerView_Loaded);
280            this.MouseEnter += new MouseEventHandler(PluginContainerView_MouseEnter);
281            this.MouseLeave += new MouseEventHandler(PluginContainerView_MouseLeave);
282            this.Model = model;
283            this.Model.UpdateableView = this;
284            this.Model.LogUpdated += new EventHandler<LogUpdated>(Model_LogUpdated);
285            this.DataContext = Model;
286            this.ConnectorViewList = new List<ConnectorView>();
287            this.RenderTransform = new TranslateTransform();
288            this.Icon = this.Model.getImage();
289        }
290
291        void Model_LogUpdated(object sender, LogUpdated e)
292        {
293            LogPresentation log = LogPanel.Child as LogPresentation;
294            log.AddLogList(Model.GuiLogEvents);
295        }
296
297        private void SetAllConnectorPositionX()
298        {
299            try
300            {
301                GeneralTransform gTransform, gTransformSec;
302                Point point, relativePoint;
303                double x, y;
304
305                foreach (ConnectorView conn in West.Children)
306                {
307                    gTransform = this.West.TransformToVisual(this);
308                    gTransformSec = conn.TransformToVisual(this.West);
309
310                    point = gTransform.Transform(new Point(0, 0));
311                    relativePoint = gTransformSec.Transform(new Point(0, 0));
312
313                    x = (RenderTransform as TranslateTransform).X + point.X + relativePoint.X;
314                    y = (RenderTransform as TranslateTransform).Y + point.Y + relativePoint.Y;
315
316                    conn.PositionOnWorkSpaceX = x;
317                    conn.PositionOnWorkSpaceY = y;
318                }
319
320                foreach (ConnectorView conn in East.Children)
321                {
322                    gTransform = this.East.TransformToVisual(this);
323                    gTransformSec = conn.TransformToVisual(this.East);
324
325                    point = gTransform.Transform(new Point(0, 0));
326                    relativePoint = gTransformSec.Transform(new Point(0, 0));
327
328                    x = (RenderTransform as TranslateTransform).X + point.X + relativePoint.X;
329                    y = (RenderTransform as TranslateTransform).Y + point.Y + relativePoint.Y;
330
331                    conn.PositionOnWorkSpaceX = x;
332                    conn.PositionOnWorkSpaceY = y;
333                }
334
335                foreach (ConnectorView conn in North.Children)
336                {
337                    gTransform = this.North.TransformToVisual(this);
338                    gTransformSec = conn.TransformToVisual(this.North);
339
340                    point = gTransform.Transform(new Point(0, 0));
341                    relativePoint = gTransformSec.Transform(new Point(0, 0));
342
343                    x = (RenderTransform as TranslateTransform).X + point.X + relativePoint.X;
344                    y = (RenderTransform as TranslateTransform).Y + point.Y + relativePoint.Y;
345
346                    conn.PositionOnWorkSpaceX = x;
347                    conn.PositionOnWorkSpaceY = y;
348                }
349
350                foreach (ConnectorView conn in South.Children)
351                {
352                    gTransform = this.South.TransformToVisual(this);
353                    gTransformSec = conn.TransformToVisual(this.South);
354
355                    point = gTransform.Transform(new Point(0, 0));
356                    relativePoint = gTransformSec.Transform(new Point(0, 0));
357
358                    x = (RenderTransform as TranslateTransform).X + point.X + relativePoint.X;
359                    y = (RenderTransform as TranslateTransform).Y + point.Y + relativePoint.Y;
360
361                    conn.PositionOnWorkSpaceX = x;
362                    conn.PositionOnWorkSpaceY = y;
363                }
364            }
365            catch (Exception e)
366            {
367                Console.Out.WriteLine(e.ToString());
368            }
369        }
370        #endregion
371
372        #region Controls
373
374        void PluginContainerView_Loaded(object sender, RoutedEventArgs e)
375        {
376           
377            BorderGradientStop.Color = ColorHelper.GetColor(this.Model.PluginType);
378            BorderGradientStopSecond.Color = Color.FromArgb(100, this.BorderGradientStop.Color.R, this.BorderGradientStop.Color.G, this.BorderGradientStop.Color.B);
379
380            if (Model.PluginPresentation != null)
381            {
382                optionList.Add(Resources["PresentationButton"] as UIElement);
383                optionList.Add(Resources["DataButton"] as UIElement);
384                optionList.Add(Resources["LogButton"] as UIElement);
385                //optionList.Add(Resources["MinimizeButton"] as UIElement);
386                optionList.Add(Resources["MaxButton"] as UIElement);
387                optionList.Add(Resources["SettingButton"] as UIElement);
388            }
389            else 
390            {
391                //optionList.Add(Resources["PresentationButton"] as UIElement);
392                optionList.Add(Resources["DataButton"] as UIElement);
393                optionList.Add(Resources["LogButton"] as UIElement);
394                //optionList.Add(Resources["MinimizeButton"] as UIElement);
395                //optionList.Add(Resources["MaxButton"] as UIElement);
396                optionList.Add(Resources["SettingButton"] as UIElement);
397            }
398
399
400            reAssambleOptions();
401
402            LogPresentation LogView = LogPanel.Child as LogPresentation;
403            LogView.LogUpdated += new EventHandler<LogUpdated>(LogView_LogUpdated);
404
405            SetAllConnectorPositionX();
406           
407        }
408
409        void LogView_LogUpdated(object sender, LogUpdated e)
410        {
411            LogPresentation logView = sender as LogPresentation;
412            ErrorCount.Text = logView.ErrorCount.ToString();
413            WarningCount.Text = logView.WarningCount.ToString();
414            DebugCount.Text = logView.DebugCount.ToString();
415            InfoCount.Text = logView.InfoCount.ToString();
416            BubblePopup.IsOpen = true;
417        }
418
419        private int optionModulo(int value)
420        {
421            int x = value % optionList.Count;
422
423            if (x < 0)
424            {
425                x += optionList.Count;
426            }
427
428            return x;
429        }
430
431        private void reAssambleOptions()
432        {
433            SlotOne.Child = null;
434            SlotTwo.Child = null;
435            SlotThree.Child = null;
436            SlotFour.Child = null;
437            SlotFive.Child = null;
438            if (Model.PluginPresentation != null)
439            {
440                SlotOne.Visibility = Visibility.Visible;
441                SlotFive.Visibility = Visibility.Visible;
442
443                SlotOne.Child = null;
444                SlotTwo.Child = null;
445                SlotThree.Child = null;
446                SlotFour.Child = null;
447                SlotFive.Child = null;
448
449                SlotOne.Child = optionList.ElementAt(optionModulo(optionPointer - 2));
450                SlotTwo.Child = optionList.ElementAt(optionModulo(optionPointer - 1));
451                SlotThree.Child = optionList.ElementAt(optionPointer);
452                SlotFour.Child = optionList.ElementAt(optionModulo(optionPointer + 1));
453                SlotFive.Child = optionList.ElementAt(optionModulo(optionPointer + 2));
454            }
455            else 
456            {
457                SlotOne.Visibility = Visibility.Collapsed;
458                SlotFive.Visibility = Visibility.Collapsed;
459
460                SlotOne.Child = null;
461                SlotTwo.Child = null;
462                SlotThree.Child = null;
463                SlotFour.Child = null;
464                SlotFive.Child = null;
465
466                SlotTwo.Child = optionList.ElementAt(optionModulo(optionPointer - 1));
467                SlotThree.Child = optionList.ElementAt(optionPointer);
468                SlotFour.Child = optionList.ElementAt(optionModulo(optionPointer + 1));
469            }
470        }
471
472        void connector_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
473        {
474            DataObject dragData = new DataObject("connector", e.connector);
475            DragDrop.DoDragDrop(e.connector.Parent, dragData, DragDropEffects.Move);
476
477            if (this.ConnectorMouseLeftButtonDown != null)
478                this.ConnectorMouseLeftButtonDown.Invoke(this, e);
479        }
480
481        private void delete()
482        {
483            if (this.Delete != null)
484                this.Delete.Invoke(this, new PluginContainerViewDeleteViewEventArgs { container = this });
485        }
486
487        private void showFullScreen()
488        {
489            if (this.FullScreen != null)
490                this.FullScreen.Invoke(this, new PluginContainerViewFullScreenViewEventArgs { container = this });
491        }
492
493        private void Button_Click_1(object sender, RoutedEventArgs e)
494        {
495           
496        }
497
498        private void Button_Click(object sender, RoutedEventArgs e)
499        {
500            Button bttn = sender as Button;
501            if (bttn.Name == "play")
502            {
503                if (model.RepeatStart)
504                    model.RepeatStart = false;
505                else
506                    model.RepeatStart = true;
507                return;
508            }
509            if (bttn.Name == "del")
510            {
511                this.delete();
512                return;
513            }
514        }
515
516        void PluginContainerView_MouseLeave(object sender, MouseEventArgs e)
517        {
518            if(ViewState != PluginViewState.Min)
519                OptionPanel.Visibility = Visibility.Visible;
520            else
521                OptionPanel.Visibility = Visibility.Collapsed;
522            (Resources["FadeIn"] as Storyboard).Stop(ControlPanel);
523            ControlPanel.BeginStoryboard(Resources["FadeOut"] as Storyboard);
524        }
525
526        void PluginContainerView_MouseEnter(object sender, MouseEventArgs e)
527        {
528            OptionPanel.Visibility = Visibility.Visible;
529            (Resources["FadeOut"] as Storyboard).Stop(ControlPanel);
530            ControlPanel.BeginStoryboard(Resources["FadeIn"] as Storyboard);
531        }
532
533        private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
534        {
535            Thumb t = sender as Thumb;
536            if (t.Cursor == Cursors.SizeWE)
537            {
538                if ((PluginBase.ActualWidth + e.HorizontalChange) > 0)
539                    PluginBase.Width = PluginBase.ActualWidth + e.HorizontalChange;
540            }
541
542            if (t.Cursor == Cursors.SizeNS)
543            {
544                if ((PluginBase.ActualHeight + e.VerticalChange) > 0)
545                    PluginBase.Height = PluginBase.ActualHeight + e.VerticalChange;
546            }
547
548            if (t.Cursor == Cursors.SizeNWSE)
549            {
550                if ((PluginBase.ActualHeight + e.VerticalChange) > 0)
551                    PluginBase.Height = PluginBase.ActualHeight + e.VerticalChange;
552
553                if ((PluginBase.ActualWidth + e.HorizontalChange) > 0)
554                    PluginBase.Width = PluginBase.ActualWidth + e.HorizontalChange;
555            }
556        }
557
558        private void MinMaxBorder_MouseLeftButtonDown(object sender, RoutedEventArgs e)
559        {
560            this.SetAllConnectorPositionX();
561        }
562
563        #endregion
564
565        #region IUpdateableView Members
566
567        public void update()
568        {
569            ProgressBar.Value = Model.PercentageFinished;
570
571            if (ViewState == PluginViewState.Data)
572            {
573                foreach (UIElement element in DataPanel.Children)
574                {
575                    DataPresentation data = element as DataPresentation;
576                    data.update();
577                }
578            }
579
580            if (Model.GuiLogEvents.Count != 0)
581            {
582                LogPresentation log = LogPanel.Child as LogPresentation;
583                log.AddLogList(Model.GuiLogEvents);
584            }
585
586            if (model.State == PluginModelState.Warning)
587            {
588                this.Window.Background = new SolidColorBrush(Colors.Yellow);
589            }
590            else if (model.State == PluginModelState.Error)
591            {
592                this.Window.Background = new SolidColorBrush(Colors.Red);
593            }
594            else
595            {
596                //todo: assign old color and appereance
597            }
598           
599        }
600
601        #endregion
602
603        private void OptionClickHandler(object sender, RoutedEventArgs e)
604        {
605            Button button = sender as Button;
606            switch (button.Name)
607            {
608                case "Left":
609                    optionPointer = optionModulo(optionPointer + 1);
610                    OptionCaption.Text = (optionList.ElementAt(optionPointer) as Button).ToolTip as String;
611                    reAssambleOptions();
612                    break;
613
614                case "Right":
615                    optionPointer = optionModulo(optionPointer - 1);;
616                    OptionCaption.Text = (optionList.ElementAt(optionPointer) as Button).ToolTip as String;
617                    reAssambleOptions();
618                    break;
619            }
620            e.Handled = true;
621        }
622
623        private void OptionChooseHandler(object sender, RoutedEventArgs e)
624        {
625            Button button = sender as Button;
626            switch (button.Name)
627            {
628                case "PresentationButton":
629                    if (PresentationPanel.Child == null)
630                    {
631                        PluginBase.Width = PluginBase.MinWidth;
632                        PluginBase.Height = PluginBase.MinHeight;
633                        ViewPanel.Visibility = Visibility.Collapsed;
634                        ViewState = PluginViewState.Min;
635                        break;
636                    }
637                    PluginBase.Width = 400;
638                    PluginBase.Height = 300;
639                    ViewPanel.Visibility = Visibility.Visible;
640                    ViewState = PluginViewState.Presentation;
641                    break;
642
643                case "DataButton":
644                    PluginBase.Width = 400;
645                    PluginBase.Height = 300;
646                    ViewPanel.Visibility = Visibility.Visible;
647                    ViewState = PluginViewState.Data;
648                    break;
649                case "LogButton":
650                    PluginBase.Width = 400;
651                    PluginBase.Height = 300;
652                    ViewPanel.Visibility = Visibility.Visible;
653                    ViewState = PluginViewState.Log;
654
655                    break;
656                case "MinimizeButton":
657                    PluginBase.Width = PluginBase.MinWidth;
658                    PluginBase.Height = PluginBase.MinHeight;
659                    ViewPanel.Visibility = Visibility.Collapsed;
660                    ViewState = PluginViewState.Min;
661                    break;
662
663                case "SettingButton":
664                   
665                    break;
666                case "MaxButton":
667                    showFullScreen();
668                    break;
669            }
670            e.Handled = true;
671        }
672
673        private void SettingButton_MouseEnter(object sender, MouseEventArgs e)
674        {
675            Button btn = sender as Button;
676            OptionCaption.Text = btn.ToolTip as String;
677        }
678    }
679
680    public class PluginContainerViewDeleteViewEventArgs : EventArgs
681    {
682        public PluginContainerView container;
683    }
684
685    public class PluginContainerViewFullScreenViewEventArgs : EventArgs
686    {
687        public PluginContainerView container;
688    }
689}
Note: See TracBrowser for help on using the repository browser.