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

Last change on this file since 1581 was 1581, checked in by kopal, 12 years ago
  • added ToolTip to ConnectorModel
  • added Icon to PluginModel
File size: 9.7 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;
24using System.Windows.Controls;
25
26namespace WorkspaceManager.Model
27{
28    /// <summary>
29    /// Class to represent and wrap a IPlugin in our model graph
30    /// </summary>
31    [Serializable]
32    public class PluginModel : VisualElementModel
33    {
34        [NonSerialized]
35        private Mutex mutex = new Mutex();
36
37        [NonSerialized]
38        private IPlugin plugin;
39
40        [NonSerialized]
41        private PluginModelState executionstate = PluginModelState.Undefined;
42
43        private int imageIndex = 0;
44       
45        /// <summary>
46        /// All ingoing connectors of this PluginModel
47        /// </summary>
48        public List<ConnectorModel> InputConnectors = null;
49
50        /// <summary>
51        /// All outgoing connectors of this PluginModel
52        /// </summary>
53        public List<ConnectorModel> OutputConnectors = null;
54
55        /// <summary>
56        /// The wrapped IPlugin of this PluginModel
57        /// </summary>
58        public IPlugin Plugin{
59            get { 
60                if(plugin==null && PluginType != null){
61                    plugin = PluginType.CreateObject();                   
62                }
63                return plugin;
64            }
65
66            private set
67            {
68                plugin = value;
69            }
70        } 
71
72        /// <summary>
73        /// The Type of the Wrapped IPlugin of this PluginModel
74        /// Depending on this the Plugin of this PluginModel will be instanciated
75        /// </summary>       
76        public Type PluginType = null;
77       
78        /// <summary>
79        /// Is the Plugin actually minimized?
80        /// </summary>
81        public bool Minimized { get; set; }
82
83        /// <summary>
84        /// The execution state of the progress of the wrapped plugin
85        /// </summary>
86        public double PercentageFinished { private get; set; }
87
88        /// <summary>
89        /// Create a new PluginModel
90        /// </summary>
91        public PluginModel()
92        {
93            this.InputConnectors = new List<ConnectorModel>();
94            this.OutputConnectors = new List<ConnectorModel>();
95        }
96
97        /// <summary>
98        /// The WorkspaceModel of this PluginModel
99        /// </summary>
100        public WorkspaceModel WorkspaceModel { get; set; }
101
102        /// <summary>
103        /// Generates all Connectors of this Plugin.
104        /// Warning: Before generation all "old" Connectors will be deleted
105        /// </summary>
106        public void generateConnectors(){
107           
108            if (Plugin != null)
109            {
110                this.InputConnectors.Clear();
111                this.OutputConnectors.Clear();
112
113                foreach (PropertyInfoAttribute propertyInfoAttribute in Plugin.GetProperties())
114                {                   
115                    if (propertyInfoAttribute.Direction.Equals(Direction.InputData))
116                    {
117                        ConnectorModel connectorModel = new ConnectorModel();
118                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.DeclaringType;
119                        connectorModel.WorkspaceModel = WorkspaceModel;
120                        connectorModel.PluginModel = this;
121                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
122                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
123                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
124                        connectorModel.ConnectorOrientation = ConnectorOrientation.West;
125                        InputConnectors.Add(connectorModel);
126                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
127                    }
128                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
129                    {
130                        ConnectorModel connectorModel = new ConnectorModel();
131                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.DeclaringType;
132                        connectorModel.WorkspaceModel = WorkspaceModel;
133                        connectorModel.PluginModel = this;
134                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
135                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
136                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
137                        connectorModel.ConnectorOrientation = ConnectorOrientation.East;
138                        connectorModel.Outgoing = true;
139                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
140                        OutputConnectors.Add(connectorModel);
141                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
142                    }
143                }
144            }     
145        }
146
147        /// <summary>
148        /// Get the Image of the Plugin
149        /// </summary>
150        /// <returns></returns>
151        public Image getImage()
152        {
153            return Plugin.GetImage(imageIndex);
154        }
155
156        /// <summary>
157        /// Returns the Presentation of the wrapped IPlugin
158        /// </summary>
159        public UserControl PluginPresentation
160        {
161            get
162            {
163                if(this.Plugin.Presentation != null){
164                    return this.Plugin.Presentation;
165                }else{
166                    return this.Plugin.QuickWatchPresentation;
167                }
168            }
169        }
170             
171        /// <summary>
172        /// Should be called by the UI-Thread to paint changes of the PluginModel
173        /// </summary>
174        public void paint()
175        {
176            //Enter some Code which calls the paint method of the IPlugin
177        }
178
179        /// <summary>
180        /// The current ExecutionState of this PluginModel
181        /// </summary>
182        public PluginModelState ExecutionState{
183            get
184            {
185                return this.executionstate;
186            }
187            set
188            {
189                this.executionstate = value;
190            }
191        }
192
193        /// <summary>
194        /// Checks wether this PluginModel is executable or not and sets the isExecutable bool
195        /// </summary>
196        /// <returns></returns>
197        public void checkExecutable()
198        {
199            if(ExecutionState == PluginModelState.Undefined){
200
201                mutex.WaitOne();
202               
203                bool AtLeastOneInputSet = false;
204                //First test if every mandatory Connector has Data
205                foreach (ConnectorModel connectorModel in this.InputConnectors)
206                {
207                    if (connectorModel.IsMandatory && !connectorModel.HasData)
208                    {
209                        mutex.ReleaseMutex();
210                        return;
211                    }
212                    else if (connectorModel.HasData)
213                    {
214                        AtLeastOneInputSet = true;
215                    }
216
217                }
218
219                //Next test if every connceted Connection to each Connection is not active
220                foreach (ConnectorModel connectorModel in this.OutputConnectors)
221                {
222                    foreach (ConnectionModel connection in connectorModel.OutputConnections)
223                    {
224                        if (connection.Active)
225                        {                           
226                            mutex.ReleaseMutex();
227                            return;
228                        }                       
229                    }
230                }
231
232                if (AtLeastOneInputSet || this.InputConnectors.Count == 0)
233                {
234                    ExecutionState = PluginModelState.Executable;
235                }
236                mutex.ReleaseMutex();
237            }
238            return;
239        }
240
241        /// <summary>
242        /// Progress of the plugin changed
243        /// </summary>
244        /// <param name="sender"></param>
245        /// <param name="args"></param>
246        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
247        {
248            this.PercentageFinished = args.Value / args.Max;
249        }
250
251        /// <summary>
252        /// Status of the plugin changed
253        /// </summary>
254        /// <param name="sender"></param>
255        /// <param name="args"></param>
256        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
257        {
258            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
259            {
260                this.imageIndex = args.ImageIndex;
261            }
262        }
263    }
264
265    /// <summary>
266    /// Execution States of a PluginModel
267    /// </summary>
268    public enum PluginModelState
269    {
270        Undefined,
271        Executable,
272        PreExecuting,
273        Executing,
274        PostExecuting,
275        Terminated,
276        Error
277    }
278}
Note: See TracBrowser for help on using the repository browser.