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

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

-added Fullscreen

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