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

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

-Logging added
-Progress bar added
-DataPresentation now updating
-PluginContainerView complete rebuilt
-Several images added

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