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

Last change on this file since 1570 was 1570, checked in by kopal, 12 years ago
  • renamed "ConntectorView" to "ConnectorView"
  • bug fix - newConnectionModel now puts the new ConnectionModel into the internal list
  • PluginModels are now executable if
    • all Mandatory Inputs are set + all Outputs are "free"
    • there are no Mandatory Inputs but at least one input is set + all Outputs are "free"
    • there are no Inputs + all Outputs are "free"
  • some small fixes
File size: 8.8 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                if(this.Plugin.Presentation != null){
150                    return this.Plugin.Presentation;
151                }else{
152                    return this.Plugin.QuickWatchPresentation;
153                }
154            }
155        }
156             
157        /// <summary>
158        /// Should be called by the UI-Thread to paint changes of the PluginModel
159        /// </summary>
160        public void paint()
161        {
162            //Enter some Code which calls the paint method of the IPlugin
163        }
164
165        /// <summary>
166        /// The current ExecutionState of this PluginModel
167        /// </summary>
168        public PluginModelState ExecutionState{
169            get
170            {
171                return this.executionstate;
172            }
173            set
174            {
175                this.executionstate = value;
176            }
177        }
178
179        /// <summary>
180        /// Checks wether this PluginModel is executable or not and sets the isExecutable bool
181        /// </summary>
182        /// <returns></returns>
183        public void checkExecutable()
184        {
185            if(ExecutionState == PluginModelState.Undefined){
186
187                mutex.WaitOne();
188               
189                bool AtLeastOneInputSet = false;
190                //First test if every mandatory Connector has Data
191                foreach (ConnectorModel connectorModel in this.InputConnectors)
192                {
193                    if (connectorModel.IsMandatory && !connectorModel.HasData)
194                    {
195                        mutex.ReleaseMutex();
196                        return;
197                    }
198                    else if (connectorModel.HasData)
199                    {
200                        AtLeastOneInputSet = true;
201                    }
202
203                }
204
205                //Next test if every connceted Connection to each Connection is not active
206                foreach (ConnectorModel connectorModel in this.OutputConnectors)
207                {
208                    foreach (ConnectionModel connection in connectorModel.OutputConnections)
209                    {
210                        if (connection.Active)
211                        {                           
212                            mutex.ReleaseMutex();
213                            return;
214                        }                       
215                    }
216                }
217
218                if (AtLeastOneInputSet || this.InputConnectors.Count == 0)
219                {
220                    ExecutionState = PluginModelState.Executable;
221                }
222                mutex.ReleaseMutex();
223            }
224            return;
225        }
226
227        /// <summary>
228        /// Progress of the plugin changed
229        /// </summary>
230        /// <param name="sender"></param>
231        /// <param name="args"></param>
232        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
233        {
234            this.PercentageFinished = args.Value / args.Max;
235        }
236    }
237
238    /// <summary>
239    /// Execution States of a PluginModel
240    /// </summary>
241    public enum PluginModelState
242    {
243        Undefined,
244        Executable,
245        PreExecuting,
246        Executing,
247        PostExecuting,
248        Terminated,
249        Error
250    }
251}
Note: See TracBrowser for help on using the repository browser.