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

Last change on this file since 1617 was 1617, checked in by kopal, 12 years ago
  • a delete of a plugin now leads to the delete of all left connections
  • added a first version of a Settings to the WorkspaceManager
  • some small bug fixes
File size: 10.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    /// <summary>
25    /// Interaction logic for WorkSpaceEditorView.xaml
26    /// </summary>
27    public partial class WorkSpaceEditorView : UserControl
28    {
29        public enum EditorState
30        {
31            READY,
32            BUSY
33        };
34        private Point previousDragPoint = new Point();
35        private ConnectorView selectedConnector;
36        private PluginContainerView selectedPluginContainer;
37        private CryptoLineView dummyLine = new CryptoLineView();
38        private Point p;
39
40        public EditorState State;
41        public EditorState ConnectorState;
42        public List<CryptoLineView> ConnectionList = new List<CryptoLineView>();
43        public List<PluginContainerView> PluginContainerList = new List<PluginContainerView>();
44        private WorkspaceModel model;
45        public WorkspaceModel Model
46        {
47            get { return model; }
48            private set { model = value; }
49        }
50
51        public WorkSpaceEditorView()
52        {
53            InitializeComponent();
54        }
55
56        public WorkSpaceEditorView(WorkspaceModel WorkspaceModel)
57        {
58            this.MouseLeave += new MouseEventHandler(WorkSpaceEditorView_MouseLeave);
59            this.Loaded += new RoutedEventHandler(WorkSpaceEditorView_Loaded);
60            this.DragEnter += new DragEventHandler(WorkSpaceEditorView_DragEnter);
61            this.Drop += new DragEventHandler(WorkSpaceEditorView_Drop);
62            this.MouseMove += new MouseEventHandler(WorkSpaceEditorView_MouseMove);
63            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_PreviewMouseRightButtonDown);
64            this.Model = WorkspaceModel;
65            this.State = EditorState.READY;
66            InitializeComponent();
67        }
68
69        void PluginDelete(object sender, PluginContainerViewDeleteViewEventArgs e)
70        {
71            /*for(int i = 0; i< e.container.ConnectorViewList.Count; i++)
72            {
73                for(int j = 0; j< e.container.ConnectorViewList[i].Model.OutputConnections.Count; j++)
74                {
75                    Model.deleteConnectionModel(e.container.ConnectorViewList[i].Model.OutputConnections[j]);
76                    for (int n = 0; n < ConnectionList.Count; n++)
77                    {
78                        if (ConnectionList[n].Model == e.container.ConnectorViewList[i].Model.OutputConnections[j] ||
79                            ConnectionList[n].Model == e.container.ConnectorViewList[i].Model.InputConnection)
80                            root.Children.Remove(ConnectionList[n]);
81                    }
82                }
83                Model.deleteConnectionModel(e.container.ConnectorViewList[i].Model.InputConnection);
84            }*/
85            Model.deletePluginModel(e.container.Model);
86            root.Children.Remove(e.container);
87        }
88
89        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
90        {
91
92        }
93
94        public void AddPluginContainerView(Point position, PluginModel model)
95        {
96            PluginContainerView shape = new PluginContainerView(model);
97            shape.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
98            shape.ShowSettings += new EventHandler<PluginContainerViewSettingsViewEventArgs>(shape_ShowSettings);
99            shape.OnConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
100            shape.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
101            shape.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
102            shape.SetPosition(position);
103            this.root.Children.Add(shape);
104            Canvas.SetZIndex(shape, 100);
105        }
106
107        void shape_ShowSettings(object sender, PluginContainerViewSettingsViewEventArgs e)
108        {
109            this.InformationPanel.Visibility = Visibility.Visible;
110        }
111
112        public void AddConnection(IConnectable source, IConnectable target)
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        public void DeleteConnection(Object sender, EventArgs args)
126        {
127            if (sender is ConnectionModel)
128            {
129                if (((ConnectionModel)sender).UpdateableView != null)
130                {
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            Color color = ColorHelper.getColor((source as ConnectorView).Model.ConnectorType);
140            conn.Stroke = new SolidColorBrush(color);
141            conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
142            conn.EndPoint = Mouse.GetPosition(this);
143        }
144
145        private MultiBinding CreateConnectorBinding(IConnectable connectable)
146        {
147            MultiBinding multiBinding = new MultiBinding();
148            multiBinding.Converter = new ConnectorBindingConverter();
149
150            Binding binding = new Binding();
151            binding.Source = connectable;
152            binding.Path = new PropertyPath(ConnectorView.PositionOnWorkSpaceXProperty);
153            multiBinding.Bindings.Add(binding);
154
155            binding = new Binding();
156            binding.Source = connectable;
157            binding.Path = new PropertyPath(ConnectorView.PositionOnWorkSpaceYProperty);
158            multiBinding.Bindings.Add(binding);
159
160            binding = new Binding();
161            binding.Source = connectable;
162            binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
163            multiBinding.Bindings.Add(binding);
164
165            binding = new Binding();
166            binding.Source = connectable;
167            binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
168            multiBinding.Bindings.Add(binding);
169
170            return multiBinding;
171        }
172
173        #region Controls
174
175        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
176        {
177            if (selectedConnector != null && e.connector.Model.ConnectorType.Name == selectedConnector.Model.ConnectorType.Name)
178            {
179                this.root.Children.Remove(dummyLine);
180                this.AddConnection(selectedConnector, e.connector);
181                this.selectedConnector = null;
182                this.State = EditorState.READY;
183                return;
184            }
185
186            if (selectedConnector == null)
187            {
188                this.root.Children.Add(dummyLine);
189                this.selectedConnector = e.connector;
190                this.AddConnectionSource(e.connector, dummyLine);
191                this.State = EditorState.BUSY;
192                return;
193            }
194           
195        }
196
197        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
198        {
199            this.selectedConnector = null;
200            this.root.Children.Remove(dummyLine);
201        }
202
203        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
204        {
205            this.selectedPluginContainer = null;
206            this.State = EditorState.READY;
207        }
208
209        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
210        {
211            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
212            {
213                p = selectedPluginContainer.GetPosition();
214                this.selectedPluginContainer.SetPosition(new Point(p.X + Mouse.GetPosition(root).X - previousDragPoint.X, p.Y + Mouse.GetPosition(root).Y - previousDragPoint.Y));
215            }
216
217            if (selectedConnector != null && root.Children.Contains(dummyLine))
218            {
219                this.dummyLine.EndPoint = Mouse.GetPosition(root);
220            }
221            this.previousDragPoint = Mouse.GetPosition(root);
222        }
223
224        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
225        {
226            Canvas.SetZIndex(sender as PluginContainerView, 100);
227            this.selectedPluginContainer = null;
228            this.State = EditorState.BUSY;
229        }
230
231        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
232        {
233            Canvas.SetZIndex(sender as PluginContainerView, 101);
234            this.selectedPluginContainer = sender as PluginContainerView;
235            this.State = EditorState.BUSY;
236            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
237            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
238        }
239
240        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
241        {
242            DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
243            PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
244            if(obj != null)
245                this.AddPluginContainerView(e.GetPosition(root), pluginModel);
246        }
247
248        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
249        {
250            e.Effects = DragDropEffects.Copy;
251        }
252
253        #endregion
254
255        private void CloseSettingsButton_Click(object sender, RoutedEventArgs e)
256        {
257            this.InformationPanel.Visibility = Visibility.Hidden;
258        }
259    }
260}
Note: See TracBrowser for help on using the repository browser.