aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Modules/Tango.FSE.Stubs/ViewModels/TestDesignerViewVM.cs
blob: 6544e643ca8e6b48b4537a772f83e9078c389766 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using Google.Protobuf;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.FSE.Common;
using Tango.Integration.Operation;
using Tango.Scripting.Basic;
using Tango.Transport;

namespace Tango.FSE.Stubs.ViewModels
{
    public class TestDesignerViewVM : FSEViewModel
    {
        private Project _project;
        public Project Project
        {
            get { return _project; }
            set { _project = value; RaisePropertyChangedAuto(); OnProjectChanged(); }
        }

        private ProjectRunner _projectRunner;
        public ProjectRunner ProjectRunner
        {
            get { return _projectRunner; }
            set { _projectRunner = value; RaisePropertyChangedAuto(); }
        }

        public ObservableCollection<Script> OpenScripts { get; set; }

        private Script _selectedScript;
        public Script SelectedScript
        {
            get { return _selectedScript; }
            set { _selectedScript = value; RaisePropertyChangedAuto(); }
        }

        public RelayCommand<Script> OpenScriptCommand { get; set; }
        public RelayCommand<Script> CloseScriptCommand { get; set; }
        public RelayCommand RunProjectCommand { get; set; }
        public RelayCommand StopProjectCommand { get; set; }

        public TestDesignerViewVM()
        {
            OpenScripts = new ObservableCollection<Script>();
            OpenScriptCommand = new RelayCommand<Script>(OpenScript);
            CloseScriptCommand = new RelayCommand<Script>(CloseScript);
            RunProjectCommand = new RelayCommand(RunProject);
            StopProjectCommand = new RelayCommand(StopProject);

            CreateNewProject();
        }

        private void StopProject()
        {
            ProjectRunner.Stop();
        }

        private async void RunProject()
        {
            try
            {
                var obj = await ProjectRunner.Run();
                await NotificationProvider.ShowSuccess(obj.ToString());
            }
            catch (OperationCanceledException)
            {
                //Do nothing.
            }
            catch (Exception ex)
            {
                await NotificationProvider.ShowError(ex.FlattenMessage());
            }
        }

        private void CloseScript(Script script)
        {
            script.IsSelected = false;
            OpenScripts.Remove(script);
            SelectedScript = OpenScripts.FirstOrDefault();
        }

        internal void OpenScript(Script script)
        {
            if (!OpenScripts.Contains(script))
            {
                OpenScripts.Add(script);
            }

            SelectedScript = script;
        }

        private void CreateNewProject()
        {
            var project = Project.New("test1", Encoding.UTF8.GetString(Properties.Resources.main_template));
            project.Scripts.Add(Script.New("lib.csx", Encoding.UTF8.GetString(Properties.Resources.lib_template)));
            project.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = this.GetType() });
            project.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(PMR.Common.MessageType) });
            project.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(ITransporter) });
            project.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(IMachineOperator) });
            project.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(IMessage) });

            Project = project;
        }

        private void OnProjectChanged()
        {
            if (Project != null)
            {
                ProjectRunner = new ProjectRunner(Project);
            }
            else
            {
                ProjectRunner = null;
            }
        }
    }
}