source: trunk/CrypPlugins/WorkspaceManager/View/Container/WorkSpaceEditorView.xaml.cs @ 1717

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

-added loading from Model
-added several images
-added Connector data presentation
-several style changes

File size: 14.0 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.Converter;
15using WorkspaceManager.View.Interface;
16using WorkspaceManager.View.VisualComponents;
17using WorkspaceManager.Model;
18using Cryptool.PluginBase.Editor;
19using Cryptool.Core;
20using Cryptool.PluginBase;
21
22namespace WorkspaceManager.View.Container
23{
24    public enum EditorState
25    {
26        READY,
27        BUSY
28    };
29    /// <summary>
30    /// Interaction logic for WorkSpaceEditorView.xaml
31    /// </summary>
32    ///
33    public partial class WorkSpaceEditorView : UserControl
34    {
35        private Point previousDragPoint = new Point();
36        private ConnectorView selectedConnector;
37        private PluginContainerView selectedPluginContainer;
38        private CryptoLineView dummyLine = new CryptoLineView();
39        private Point point;
40
41        public EditorState State;
42        public EditorState ConnectorState;
43        public List<CryptoLineView> ConnectionList = new List<CryptoLineView>();
44        public List<PluginContainerView> PluginContainerList = new List<PluginContainerView>();
45        private WorkspaceModel model;
46        public WorkspaceModel Model
47        {
48            get { return model; }
49            set { model = value; }
50        }
51
52        public WorkSpaceEditorView()
53        {
54            InitializeComponent();
55        }
56
57        public WorkSpaceEditorView(WorkspaceModel WorkspaceModel)
58        {
59            setBaseControl(WorkspaceModel);
60            InitializeComponent();
61        }
62
63        private void setBaseControl(WorkspaceModel WorkspaceModel)
64        {
65            this.MouseLeftButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_OnMouseLeftButtonDown);
66            this.MouseLeave += new MouseEventHandler(WorkSpaceEditorView_MouseLeave);
67            this.Loaded += new RoutedEventHandler(WorkSpaceEditorView_Loaded);
68            this.DragEnter += new DragEventHandler(WorkSpaceEditorView_DragEnter);
69            this.Drop += new DragEventHandler(WorkSpaceEditorView_Drop);
70            this.MouseMove += new MouseEventHandler(WorkSpaceEditorView_MouseMove);
71            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_PreviewMouseRightButtonDown);
72            this.Model = WorkspaceModel;
73            this.State = EditorState.READY;
74        }
75
76        void PluginDelete(object sender, PluginContainerViewDeleteViewEventArgs e)
77        {
78            if (this.State == EditorState.READY)
79            {
80                Model.deletePluginModel(e.container.Model);
81                root.Children.Remove(e.container);
82            }
83        }
84
85        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
86        {
87        }
88
89        public void AddPluginContainerView(Point position, PluginModel model)
90        {
91            if (this.State == EditorState.READY)
92            {
93                PluginContainerView newPluginContainerView = new PluginContainerView(model);
94                newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
95                newPluginContainerView.ShowSettings += new EventHandler<PluginContainerViewSettingsViewEventArgs>(shape_ShowSettings);
96                newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
97                newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
98                newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
99                newPluginContainerView.SetPosition(position);
100                this.root.Children.Add(newPluginContainerView);
101                Canvas.SetZIndex(newPluginContainerView, 100);
102            }
103        }
104
105        void shape_ShowSettings(object sender, PluginContainerViewSettingsViewEventArgs e)
106        {
107            this.InformationPanel.Visibility = Visibility.Visible;
108        }
109
110        public void AddConnection(IConnectable source, IConnectable target)
111        {
112            if (this.State == EditorState.READY)
113            {
114                ConnectionModel connectionModel = this.Model.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
115                CryptoLineView conn = new CryptoLineView(connectionModel);
116                connectionModel.UpdateableView = conn;
117                connectionModel.OnDelete += DeleteConnection;
118                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
119                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
120                root.Children.Add(conn);
121                ConnectionList.Add(conn);
122                Canvas.SetZIndex(conn, 0);
123            }
124        }
125
126        public void DeleteConnection(Object sender, EventArgs args)
127        {
128            if (sender is ConnectionModel)
129            {
130                if(((ConnectionModel)sender).UpdateableView != null){
131                    UIElement uielement = (UIElement)((ConnectionModel)sender).UpdateableView;
132                    root.Children.Remove(uielement);
133                }
134            }
135        }
136
137        private void AddConnectionSource(IConnectable source, CryptoLineView conn)
138        {
139            if (this.State == EditorState.READY)
140            {
141                Color color = ColorHelper.GetColor((source as ConnectorView).Model.ConnectorType);
142                conn.Stroke = new SolidColorBrush(color);
143                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
144                conn.EndPoint = Mouse.GetPosition(this);
145            }
146        }
147
148        private MultiBinding CreateConnectorBinding(IConnectable connectable)
149        {
150            MultiBinding multiBinding = new MultiBinding();
151            multiBinding.Converter = new ConnectorBindingConverter();
152
153            Binding binding = new Binding();
154            binding.Source = connectable;
155            binding.Path = new PropertyPath(ConnectorView.X);
156            multiBinding.Bindings.Add(binding);
157
158            binding = new Binding();
159            binding.Source = connectable;
160            binding.Path = new PropertyPath(ConnectorView.Y);
161            multiBinding.Bindings.Add(binding);
162
163            binding = new Binding();
164            binding.Source = connectable;
165            binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
166            multiBinding.Bindings.Add(binding);
167
168            binding = new Binding();
169            binding.Source = connectable;
170            binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
171            multiBinding.Bindings.Add(binding);
172
173            return multiBinding;
174        }
175
176        #region Controls
177
178        void WorkSpaceEditorView_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
179        {
180            if (!e.Handled)
181            {
182                PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
183                this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
184            }
185        }
186
187        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
188        {
189            if (this.State == EditorState.READY)
190            {
191                if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
192                {
193                    this.root.Children.Remove(dummyLine);
194                    this.AddConnection(selectedConnector, e.connector);
195                    this.selectedConnector = null;
196                    return;
197                }
198
199                if (selectedConnector == null && e.connector.Model.Outgoing)
200                {
201                    this.root.Children.Add(dummyLine);
202                    this.selectedConnector = e.connector;
203                    this.AddConnectionSource(e.connector, dummyLine);
204                    return;
205                }
206            }
207           
208        }
209
210        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
211        {
212            if (this.State == EditorState.READY)
213            {
214                this.selectedConnector = null;
215                this.root.Children.Remove(dummyLine);
216            }
217        }
218
219        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
220        {
221            if (this.State == EditorState.READY)
222            {
223                this.selectedPluginContainer = null;
224            }
225        }     
226
227        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
228        {
229            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
230            {
231                point = selectedPluginContainer.GetPosition();
232                this.selectedPluginContainer.SetPosition(new Point(point.X + Mouse.GetPosition(root).X - previousDragPoint.X, point.Y + Mouse.GetPosition(root).Y - previousDragPoint.Y));
233            }
234
235            if (selectedConnector != null && root.Children.Contains(dummyLine))
236            {
237                this.dummyLine.EndPoint = Mouse.GetPosition(root);
238            }
239            this.previousDragPoint = Mouse.GetPosition(root);
240        }
241
242        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
243        {
244            Canvas.SetZIndex(sender as PluginContainerView, 100);
245            this.selectedPluginContainer = null;
246        }
247
248        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
249        {
250            Canvas.SetZIndex(sender as PluginContainerView, 101);
251            this.selectedPluginContainer = sender as PluginContainerView;
252            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
253            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
254            e.Handled = true;
255        }
256
257        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
258        {
259            if (this.State == EditorState.READY)
260            {
261                DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
262                PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
263                if (obj != null)
264                    this.AddPluginContainerView(e.GetPosition(root), pluginModel);
265            }
266        }
267
268        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
269        {
270            if (this.State == EditorState.READY)
271            {
272                e.Effects = DragDropEffects.Copy;
273            }
274            else if (this.State == EditorState.BUSY)
275            {
276                e.Effects = DragDropEffects.None;
277            }
278        }
279
280        #endregion
281
282        private void CloseSettingsButton_Click(object sender, RoutedEventArgs e)
283        {
284            this.InformationPanel.Visibility = Visibility.Hidden;
285        }
286
287        internal void Load(WorkspaceModel WorkspaceModel)
288        {
289            this.Model = WorkspaceModel;
290
291            foreach (PluginModel model in this.Model.AllPluginModels)
292            {
293                this.loadPluginContainerView(model);
294            }
295            foreach(ConnectionModel connModel in WorkspaceModel.AllConnectionModels)
296            {
297                CryptoLineView conn = new CryptoLineView(connModel);
298                connModel.UpdateableView = conn;
299                connModel.OnDelete += DeleteConnection;
300
301                foreach (UIElement element in root.Children)
302                {
303                    PluginContainerView container = element as PluginContainerView;
304                    if (container != null)
305                    {
306                        foreach (ConnectorView connector in container.ConnectorViewList)
307                        {
308                            if(connModel.From == connector.model)
309                                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(connector));
310                            else if(connModel.To == connector.model)
311                                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(connector));
312                        }
313                    }
314                }
315
316                root.Children.Add(conn);
317                ConnectionList.Add(conn);
318                Canvas.SetZIndex(conn, 0);
319            }
320        }
321
322        private void loadPluginContainerView(PluginModel model)
323        {
324            PluginContainerView newPluginContainerView = new PluginContainerView(model);
325
326            newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
327            newPluginContainerView.ShowSettings += new EventHandler<PluginContainerViewSettingsViewEventArgs>(shape_ShowSettings);
328            newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
329            newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
330            newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
331            newPluginContainerView.SetPosition(model.Position);
332            this.root.Children.Add(newPluginContainerView);
333            Canvas.SetZIndex(newPluginContainerView, 100);
334        }
335    }
336}
Note: See TracBrowser for help on using the repository browser.