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

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

-added RepeatStart functionality

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