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

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

-Logging added
-Progress bar added
-DataPresentation now updating
-PluginContainerView complete rebuilt
-Several images added

File size: 20.9 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            this.delete();
402        }
403
404        void PluginContainerView_MouseLeave(object sender, MouseEventArgs e)
405        {
406            if(ViewState != PluginViewState.Min)
407                OptionPanel.Visibility = Visibility.Visible;
408            else
409                OptionPanel.Visibility = Visibility.Collapsed;
410            (Resources["FadeIn"] as Storyboard).Stop(ControlPanel);
411            ControlPanel.BeginStoryboard(Resources["FadeOut"] as Storyboard);
412        }
413
414        void PluginContainerView_MouseEnter(object sender, MouseEventArgs e)
415        {
416            OptionPanel.Visibility = Visibility.Visible;
417            (Resources["FadeOut"] as Storyboard).Stop(ControlPanel);
418            ControlPanel.BeginStoryboard(Resources["FadeIn"] as Storyboard);
419        }
420
421        private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
422        {
423            Thumb t = sender as Thumb;
424            if (t.Cursor == Cursors.SizeWE)
425            {
426                if ((PluginBase.ActualWidth + e.HorizontalChange) > 0)
427                    PluginBase.Width = PluginBase.ActualWidth + e.HorizontalChange;
428            }
429
430            if (t.Cursor == Cursors.SizeNS)
431            {
432                if ((PluginBase.ActualHeight + e.VerticalChange) > 0)
433                    PluginBase.Height = PluginBase.ActualHeight + e.VerticalChange;
434            }
435
436            if (t.Cursor == Cursors.SizeNWSE)
437            {
438                if ((PluginBase.ActualHeight + e.VerticalChange) > 0)
439                    PluginBase.Height = PluginBase.ActualHeight + e.VerticalChange;
440
441                if ((PluginBase.ActualWidth + e.HorizontalChange) > 0)
442                    PluginBase.Width = PluginBase.ActualWidth + e.HorizontalChange;
443            }
444        }
445
446        private void MinMaxBorder_MouseLeftButtonDown(object sender, RoutedEventArgs e)
447        {
448            this.SetAllConnectorPositionX();
449        }
450
451        private void ShowAllButton_Click(object sender, RoutedEventArgs e)
452        {
453
454        }
455        #endregion
456
457        #region IUpdateableView Members
458
459        public void update()
460        {
461            ProgressBar.Value = Model.PercentageFinished;
462
463            if (ViewState == PluginViewState.Data)
464            {
465                foreach (UIElement element in DataPanel.Children)
466                {
467                    DataPresentation data = element as DataPresentation;
468                    data.update();
469                }
470            }
471
472            if (ViewState == PluginViewState.Log)
473            {
474                LogPresentation log = LogPanel.Child as LogPresentation;
475                log.AddLogList(Model.GuiLogEvents);
476            }
477
478            if (model.State == PluginModelState.Warning)
479            {
480                this.Window.Background = new SolidColorBrush(Colors.Yellow);
481            }
482            else if (model.State == PluginModelState.Error)
483            {
484                this.Window.Background = new SolidColorBrush(Colors.Red);
485            }
486            else
487            {
488                //todo: assign old color and appereance
489            }
490           
491        }
492
493        #endregion
494
495        private void OptionClickHandler(object sender, RoutedEventArgs e)
496        {
497            Button button = sender as Button;
498            switch (button.Name)
499            {
500                case "Left":
501                    optionPointer = (optionPointer + 1) % optionList.Count;
502                    Options.Child = optionList.ElementAt(optionPointer);
503                    OptionCaption.Text = (optionList.ElementAt(optionPointer) as Button).ToolTip as String;
504                    break;
505
506                case "Right":
507                    optionPointer = (optionPointer - 1) % optionList.Count;
508
509                    if (optionPointer < 0)
510                    {
511                        optionPointer += optionList.Count;
512                        Options.Child = optionList.ElementAt(optionPointer);
513                        OptionCaption.Text = (optionList.ElementAt(optionPointer) as Button).ToolTip as String;
514                    }
515                    else
516                    {
517                        OptionCaption.Text = (optionList.ElementAt(optionPointer) as Button).ToolTip as String;
518                        Options.Child = optionList.ElementAt(optionPointer);
519                    }
520
521                    break;
522            }
523            e.Handled = true;
524        }
525
526        private void OptionChooseHandler(object sender, RoutedEventArgs e)
527        {
528            Button button = sender as Button;
529            switch (button.Name)
530            {
531                case "PresentationButton":
532                    if (PresentationPanel.Child == null)
533                    {
534                        PluginBase.Width = PluginBase.MinWidth;
535                        PluginBase.Height = PluginBase.MinHeight;
536                        ViewPanel.Visibility = Visibility.Collapsed;
537                        ViewState = PluginViewState.Min;
538                        break;
539                    }
540                    PluginBase.Width = 400;
541                    PluginBase.Height = 300;
542                    ViewPanel.Visibility = Visibility.Visible;
543                    ViewState = PluginViewState.Presentation;
544                    break;
545
546                case "DataButton":
547                    PluginBase.Width = 400;
548                    PluginBase.Height = 300;
549                    ViewPanel.Visibility = Visibility.Visible;
550                    ViewState = PluginViewState.Data;
551                    break;
552                case "LogButton":
553                    PluginBase.Width = 400;
554                    PluginBase.Height = 300;
555                    ViewPanel.Visibility = Visibility.Visible;
556                    ViewState = PluginViewState.Log;
557
558                    break;
559                case "MinimizeButton":
560                    PluginBase.Width = PluginBase.MinWidth;
561                    PluginBase.Height = PluginBase.MinHeight;
562                    ViewPanel.Visibility = Visibility.Collapsed;
563                    ViewState = PluginViewState.Min;
564                    break;
565
566                case "SettingButton":
567                    PluginBase.Width = 400;
568                    PluginBase.Height = 300;
569                    ViewPanel.Visibility = Visibility.Visible;
570                    ViewState = PluginViewState.Setting;
571                    break;
572            }
573            e.Handled = true;
574        }
575    }
576
577    public class PluginContainerViewDeleteViewEventArgs : EventArgs
578    {
579        public PluginContainerView container;
580    }
581
582    public class PluginContainerViewSettingsViewEventArgs : EventArgs
583    {
584        public PluginContainerView container;
585    }
586}
Note: See TracBrowser for help on using the repository browser.