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

Last change on this file since 1847 was 1847, checked in by kopal, 11 years ago
  • added support for serializing/deserializing pictures into model files
File size: 16.7 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        private PluginContainerView currentFullViewContainer;
41
42        public EditorState State;
43        public EditorState ConnectorState;
44        public List<CryptoLineView> ConnectionList = new List<CryptoLineView>();
45        public List<PluginContainerView> PluginContainerList = new List<PluginContainerView>();
46        private WorkspaceModel model;
47        public WorkspaceModel Model
48        {
49            get { return model; }
50            set { model = value; }
51        }
52
53        public WorkSpaceEditorView()
54        {
55            InitializeComponent();
56        }
57
58        public WorkSpaceEditorView(WorkspaceModel WorkspaceModel)
59        {
60            setBaseControl(WorkspaceModel);                       
61            InitializeComponent();
62            this.UserControlWrapper.Children.Add(new UserContentWrapper(WorkspaceModel));
63        }
64
65        private void setBaseControl(WorkspaceModel WorkspaceModel)
66        {
67            this.MouseLeftButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_OnMouseLeftButtonDown);
68            this.MouseLeave += new MouseEventHandler(WorkSpaceEditorView_MouseLeave);
69            this.Loaded += new RoutedEventHandler(WorkSpaceEditorView_Loaded);
70            this.DragEnter += new DragEventHandler(WorkSpaceEditorView_DragEnter);
71            this.Drop += new DragEventHandler(WorkSpaceEditorView_Drop);
72            this.MouseMove += new MouseEventHandler(WorkSpaceEditorView_MouseMove);
73            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_PreviewMouseRightButtonDown);
74            this.Model = WorkspaceModel;
75            this.State = EditorState.READY;
76        }
77
78        void PluginDelete(object sender, PluginContainerViewDeleteViewEventArgs e)
79        {
80            if (this.State == EditorState.READY)
81            {
82                Model.deletePluginModel(e.container.Model);
83                root.Children.Remove(e.container);
84                Model.WorkspaceManagerEditor.HasChanges = true;
85            }
86        }
87
88        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
89        {
90        }
91
92        public void AddPluginContainerView(Point position, PluginModel model)
93        {
94            if (this.State == EditorState.READY)
95            {
96                PluginContainerView newPluginContainerView = new PluginContainerView(model);
97                newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
98                newPluginContainerView.FullScreen += new EventHandler<PluginContainerViewFullScreenViewEventArgs>(shape_FullScreen);
99                newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
100                newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
101                newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
102                newPluginContainerView.SetPosition(new Point((Math.Round((position.X) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
103                                                            (Math.Round((position.Y) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
104
105                this.root.Children.Add(newPluginContainerView);
106                Canvas.SetZIndex(newPluginContainerView, 100);
107                Model.WorkspaceManagerEditor.HasChanges = true;
108            }
109        }
110
111        void shape_FullScreen(object sender, PluginContainerViewFullScreenViewEventArgs e)
112        {
113            this.InformationPanel.Visibility = Visibility.Visible;
114            e.container.PresentationPanel.Child = null;
115            this.FullPresentation.Children.Add(e.container.Model.PluginPresentation);
116            this.currentFullViewContainer = e.container;
117        }
118
119        public void AddConnection(ConnectorView source, ConnectorView target)
120        {
121            if (this.State == EditorState.READY)
122            {
123                ConnectionModel connectionModel = this.Model.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
124                CryptoLineView conn = new CryptoLineView(connectionModel);
125                connectionModel.UpdateableView = conn;
126                connectionModel.OnDelete += DeleteConnection;
127                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
128                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
129                root.Children.Add(conn);
130                ConnectionList.Add(conn);
131                Canvas.SetZIndex(conn, 0);
132            }
133        }
134
135        public void DeleteConnection(Object sender, EventArgs args)
136        {
137            if (sender is ConnectionModel)
138            {
139                if(((ConnectionModel)sender).UpdateableView != null){
140                    UIElement uielement = (UIElement)((ConnectionModel)sender).UpdateableView;
141                    root.Children.Remove(uielement);
142                }
143            }
144        }
145
146        private void AddConnectionSource(ConnectorView source, CryptoLineView conn)
147        {
148            if (this.State == EditorState.READY)
149            {
150                Color color = ColorHelper.GetColor((source as ConnectorView).Model.ConnectorType);
151                conn.Stroke = new SolidColorBrush(color);
152                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
153                conn.EndPoint = Mouse.GetPosition(this);
154            }
155        }
156
157        private MultiBinding CreateConnectorBinding(ConnectorView connectable)
158        {
159            MultiBinding multiBinding = new MultiBinding();
160            multiBinding.Converter = new ConnectorBindingConverter();
161            multiBinding.ConverterParameter = connectable;
162
163            Binding binding = new Binding();
164            binding.Source = connectable;
165            binding.Path = new PropertyPath(ConnectorView.X);
166            multiBinding.Bindings.Add(binding);
167
168            binding = new Binding();
169            binding.Source = connectable;
170            binding.Path = new PropertyPath(ConnectorView.Y);
171            multiBinding.Bindings.Add(binding);
172
173            binding = new Binding();
174            binding.Source = connectable;
175            binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
176            multiBinding.Bindings.Add(binding);
177
178            binding = new Binding();
179            binding.Source = connectable;
180            binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
181            multiBinding.Bindings.Add(binding);
182
183
184            return multiBinding;
185        }
186
187        #region Controls
188
189        void WorkSpaceEditorView_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
190        {
191            if (!e.Handled)
192            {
193                PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
194                this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
195            }
196        }
197
198        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
199        {
200            if (this.State == EditorState.READY)
201            {
202                if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
203                {
204                    this.root.Children.Remove(dummyLine);
205                    this.AddConnection(selectedConnector, e.connector);
206                    this.selectedConnector = null;
207                    return;
208                }
209
210                if (selectedConnector == null && e.connector.Model.Outgoing)
211                {
212                    this.root.Children.Add(dummyLine);
213                    this.selectedConnector = e.connector;
214                    this.AddConnectionSource(e.connector, dummyLine);
215                    return;
216                }
217            }
218           
219        }
220
221        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
222        {
223            if (this.State == EditorState.READY)
224            {
225                this.selectedConnector = null;
226                this.root.Children.Remove(dummyLine);
227            }
228        }
229
230        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
231        {
232            if (this.State == EditorState.READY)
233            {
234                this.selectedPluginContainer = null;
235            }
236        }     
237
238        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
239        {
240            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
241            {
242                point = selectedPluginContainer.GetPosition();
243                this.selectedPluginContainer.SetPosition(new Point((Math.Round((Mouse.GetPosition(root).X - previousDragPoint.X) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
244                                                            (Math.Round((Mouse.GetPosition(root).Y - previousDragPoint.Y) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
245                Model.WorkspaceManagerEditor.HasChanges = true;
246                //this.selectedPluginContainer.SetPosition(new Point((Math.Round(( Mouse.GetPosition(root).X )/Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
247                //                                            (Math.Round(( Mouse.GetPosition(root).Y ) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
248            }
249
250
251
252            if (selectedConnector != null && root.Children.Contains(dummyLine))
253            {
254                this.dummyLine.EndPoint = Mouse.GetPosition(root);
255            }
256        }
257
258        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
259        {
260            Canvas.SetZIndex(sender as PluginContainerView, 100);
261            this.selectedPluginContainer = null;
262        }
263
264        private void Button_Click(object sender, RoutedEventArgs e)
265        {
266            SliderEditorSize.Value += 0.3;
267        }
268
269        private void Button_Click_1(object sender, RoutedEventArgs e)
270        {
271            SliderEditorSize.Value -= 0.3;
272        }
273
274        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
275        {
276            this.selectedPluginContainer = sender as PluginContainerView;
277            this.previousDragPoint = Mouse.GetPosition(selectedPluginContainer); 
278            Canvas.SetZIndex(selectedPluginContainer, 101);
279
280            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
281            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
282
283            e.Handled = true;
284        }
285
286        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
287        {
288            if (this.State == EditorState.READY)
289            {
290                if (e.Data.GetDataPresent("Cryptool.PluginBase.Editor.DragDropDataObject"))
291                {
292                    DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
293                    PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
294                    if (obj != null)
295                        this.AddPluginContainerView(e.GetPosition(root), pluginModel);
296                    Model.WorkspaceManagerEditor.HasChanges = true;
297                }
298                else
299                    return;
300            }
301        }
302
303        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
304        {
305            if (this.State == EditorState.READY)
306            {
307                e.Effects = DragDropEffects.Copy;
308            }
309            else if (this.State == EditorState.BUSY)
310            {
311                e.Effects = DragDropEffects.None;
312            }
313        }
314
315        #endregion
316
317        private void CloseSettingsButton_Click(object sender, RoutedEventArgs e)
318        {
319            this.InformationPanel.Visibility = Visibility.Collapsed;
320            this.FullPresentation.Children.Clear();
321            this.currentFullViewContainer.PresentationPanel.Child = currentFullViewContainer.Model.PluginPresentation;
322            this.currentFullViewContainer = null;
323        }
324
325        internal void Load(WorkspaceModel WorkspaceModel)
326        {
327            this.Model = WorkspaceModel;
328            this.UserControlWrapper.Children.Clear();
329            UserContentWrapper UserContentWrapper = new UserContentWrapper(WorkspaceModel);
330            this.UserControlWrapper.Children.Add(UserContentWrapper);           
331
332            foreach (PluginModel model in this.Model.AllPluginModels)
333            {
334                this.loadPluginContainerView(model);
335            }
336            foreach (ConnectionModel connModel in WorkspaceModel.AllConnectionModels)
337            {
338                CryptoLineView conn = new CryptoLineView(connModel);
339                connModel.UpdateableView = conn;
340                connModel.OnDelete += DeleteConnection;
341
342                foreach (UIElement element in root.Children)
343                {
344                    PluginContainerView container = element as PluginContainerView;
345                    if (container != null)
346                    {
347                        foreach (ConnectorView connector in container.ConnectorViewList)
348                        {
349                            if (connModel.From == connector.Model)
350                                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(connector));
351                            else if (connModel.To == connector.Model)
352                                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(connector));
353                        }
354                    }
355                }
356
357                root.Children.Add(conn);
358                ConnectionList.Add(conn);
359                Canvas.SetZIndex(conn, 0);
360            }
361        }
362
363        private void loadPluginContainerView(PluginModel model)
364        {
365            PluginContainerView newPluginContainerView = new PluginContainerView(model);
366
367            newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
368            newPluginContainerView.FullScreen += new EventHandler<PluginContainerViewFullScreenViewEventArgs>(shape_FullScreen);
369            newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
370            newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
371            newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
372            newPluginContainerView.SetPosition(model.Position);
373            this.root.Children.Add(newPluginContainerView);
374            Canvas.SetZIndex(newPluginContainerView, 100);
375        }
376
377        internal void ResetConnections()
378        {
379            foreach (CryptoLineView line in ConnectionList)
380            {
381                line.Reset();
382            }
383        }
384    }
385}
Note: See TracBrowser for help on using the repository browser.