source: trunk/CrypPlugins/WorkspaceManager/Model/PluginModel.cs @ 1562

Last change on this file since 1562 was 1562, checked in by kopal, 12 years ago
  • replaced x,y.coordinates of PluginModel with a Point
  • Fetched OnPluginProgressChanged now by PluginModel and automatically set PercentageFinished
  • some small fixes
File size: 8.3 KB
Line 
1/*                             
2   Copyright 2010 Nils Kopal, Viktor M.
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17
18using System;
19using System.Collections.Generic;
20using System.Linq;
21using System.Text;
22using Cryptool.PluginBase;
23using System.Threading;
24
25namespace WorkspaceManager.Model
26{
27    /// <summary>
28    /// Class to represent and wrap a IPlugin in our model graph
29    /// </summary>
30    [Serializable]
31    public class PluginModel : VisualElementModel
32    {
33        [NonSerialized]
34        private Mutex mutex = new Mutex();
35
36        [NonSerialized]
37        private IPlugin plugin;
38
39        [NonSerialized]
40        private PluginModelState executionstate = PluginModelState.Undefined;
41
42        /// <summary>
43        /// All ingoing connectors of this PluginModel
44        /// </summary>
45        public List<ConnectorModel> InputConnectors = null;
46
47        /// <summary>
48        /// All outgoing connectors of this PluginModel
49        /// </summary>
50        public List<ConnectorModel> OutputConnectors = null;
51
52        /// <summary>
53        /// The wrapped IPlugin of this PluginModel
54        /// </summary>
55        public IPlugin Plugin{
56            get { 
57                if(plugin==null && PluginType != null){
58                    plugin = PluginType.CreateObject();                   
59                }
60                return plugin;
61            }
62
63            private set
64            {
65                plugin = value;
66            }
67        } 
68
69        /// <summary>
70        /// The Type of the Wrapped IPlugin of this PluginModel
71        /// Depending on this the Plugin of this PluginModel will be instanciated
72        /// </summary>       
73        public Type PluginType = null;
74       
75        /// <summary>
76        /// Is the Plugin actually minimized?
77        /// </summary>
78        public bool Minimized { get; set; }
79
80        /// <summary>
81        /// The execution state of the progress of the wrapped plugin
82        /// </summary>
83        public double PercentageFinished { get; set; }
84
85        /// <summary>
86        /// Create a new PluginModel
87        /// </summary>
88        public PluginModel()
89        {
90            this.InputConnectors = new List<ConnectorModel>();
91            this.OutputConnectors = new List<ConnectorModel>();
92        }
93
94        /// <summary>
95        /// The WorkspaceModel of this PluginModel
96        /// </summary>
97        public WorkspaceModel WorkspaceModel { get; set; }
98
99        /// <summary>
100        /// Generates all Connectors of this Plugin.
101        /// Warning: Before generation all "old" Connectors will be deleted
102        /// </summary>
103        public void generateConnectors(){
104           
105            if (Plugin != null)
106            {
107                this.InputConnectors.Clear();
108                this.OutputConnectors.Clear();
109
110                foreach (PropertyInfoAttribute propertyInfoAttribute in Plugin.GetProperties())
111                {                   
112                    if (propertyInfoAttribute.Direction.Equals(Direction.InputData))
113                    {
114                        ConnectorModel connectorModel = new ConnectorModel();
115                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.DeclaringType;
116                        connectorModel.WorkspaceModel = WorkspaceModel;
117                        connectorModel.PluginModel = this;
118                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
119                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
120                        connectorModel.ConnectorOrientation = ConnectorOrientation.West;
121                        InputConnectors.Add(connectorModel);
122                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
123                    }
124                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
125                    {
126                        ConnectorModel connectorModel = new ConnectorModel();
127                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.DeclaringType;
128                        connectorModel.WorkspaceModel = WorkspaceModel;
129                        connectorModel.PluginModel = this;
130                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
131                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
132                        connectorModel.ConnectorOrientation = ConnectorOrientation.East;
133                        connectorModel.Outgoing = true;
134                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
135                        OutputConnectors.Add(connectorModel);
136                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
137                    }
138                }
139            }     
140        }
141
142        /// <summary>
143        /// Returns the Presentation of the wrapped IPlugin
144        /// </summary>
145        public System.Windows.Controls.UserControl PluginPresentation
146        {
147            get
148            {
149                return this.Plugin.Presentation;
150            }
151        }
152             
153        /// <summary>
154        /// Should be called by the UI-Thread to paint changes of the PluginModel
155        /// </summary>
156        public void paint()
157        {
158            //Enter some Code which calls the paint method of the IPlugin
159        }
160
161        /// <summary>
162        /// The current ExecutionState of this PluginModel
163        /// </summary>
164        public PluginModelState ExecutionState{
165            get
166            {
167                return this.executionstate;
168            }
169            set
170            {
171                this.executionstate = value;
172            }
173        }
174
175        /// <summary>
176        /// Checks wether this PluginModel is executable or not and sets the isExecutable bool
177        /// </summary>
178        /// <returns></returns>
179        public void checkExecutable()
180        {
181            if(ExecutionState == PluginModelState.Undefined){
182
183                mutex.WaitOne();
184                //First test if every mandatory Connector has Data
185                foreach (ConnectorModel connectorModel in this.InputConnectors)
186                {
187                    if (connectorModel.IsMandatory && !connectorModel.HasData)
188                    {
189                        mutex.ReleaseMutex();
190                        return;
191                    }
192
193                }
194
195                //Next test if every connceted Connection to each Connection is not active
196                foreach (ConnectorModel connectorModel in this.OutputConnectors)
197                {
198                    foreach (ConnectionModel connection in connectorModel.OutputConnections)
199                    {
200                        if (connection.Active)
201                        {                           
202                            mutex.ReleaseMutex();
203                            return;
204                        }                       
205                    }
206                }
207
208                ExecutionState = PluginModelState.Executable;
209                mutex.ReleaseMutex();
210            }
211            return;
212        }
213
214        /// <summary>
215        /// Progress of the plugin changed
216        /// </summary>
217        /// <param name="sender"></param>
218        /// <param name="args"></param>
219        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
220        {
221            this.PercentageFinished = args.Value / args.Max;
222        }
223    }
224
225    /// <summary>
226    /// Execution States of a PluginModel
227    /// </summary>
228    public enum PluginModelState
229    {
230        Undefined,
231        Executable,
232        PreExecuting,
233        Executing,
234        PostExecuting,
235        Terminated,
236        Error
237    }
238}
Note: See TracBrowser for help on using the repository browser.