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

Last change on this file since 1621 was 1621, checked in by matkovic, 11 years ago
  • Plugin resize now working
  • each PluginType now distinguish in color
File size: 10.2 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 point;
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            Model.deletePluginModel(e.container.Model);
72            root.Children.Remove(e.container);
73        }
74
75        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
76        {
77        }
78
79        public void AddPluginContainerView(Point position, PluginModel model)
80        {
81            PluginContainerView newPluginContainerView = new PluginContainerView(model);
82            newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
83            newPluginContainerView.ShowSettings += new EventHandler<PluginContainerViewSettingsViewEventArgs>(shape_ShowSettings);
84            newPluginContainerView.OnConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
85            newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
86            newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
87            newPluginContainerView.SetPosition(position);
88            this.root.Children.Add(newPluginContainerView);
89            Canvas.SetZIndex(newPluginContainerView, 100);
90        }
91
92        void shape_ShowSettings(object sender, PluginContainerViewSettingsViewEventArgs e)
93        {
94            this.InformationPanel.Visibility = Visibility.Visible;
95        }
96
97        public void AddConnection(IConnectable source, IConnectable target)
98        {
99            ConnectionModel connectionModel = this.Model.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
100            CryptoLineView conn = new CryptoLineView(connectionModel);
101            connectionModel.UpdateableView = conn;
102            connectionModel.OnDelete += DeleteConnection;
103            conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
104            conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
105            root.Children.Add(conn);
106            ConnectionList.Add(conn);
107            Canvas.SetZIndex(conn, 0);           
108        }
109
110        public void DeleteConnection(Object sender, EventArgs args)
111        {
112            if (sender is ConnectionModel)
113            {
114                if(((ConnectionModel)sender).UpdateableView != null){
115                    UIElement uielement = (UIElement)((ConnectionModel)sender).UpdateableView;
116                    root.Children.Remove(uielement);
117                }
118            }
119        }
120
121        private void AddConnectionSource(IConnectable source, CryptoLineView conn)
122        {
123            Color color = ColorHelper.GetDataColor((source as ConnectorView).Model.ConnectorType);
124            conn.Stroke = new SolidColorBrush(color);
125            conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
126            conn.EndPoint = Mouse.GetPosition(this);
127        }
128
129        private MultiBinding CreateConnectorBinding(IConnectable connectable)
130        {
131            MultiBinding multiBinding = new MultiBinding();
132            multiBinding.Converter = new ConnectorBindingConverter();
133
134            Binding binding = new Binding();
135            binding.Source = connectable;
136            binding.Path = new PropertyPath(ConnectorView.PositionOnWorkSpaceXProperty);
137            multiBinding.Bindings.Add(binding);
138
139            binding = new Binding();
140            binding.Source = connectable;
141            binding.Path = new PropertyPath(ConnectorView.PositionOnWorkSpaceYProperty);
142            multiBinding.Bindings.Add(binding);
143
144            binding = new Binding();
145            binding.Source = connectable;
146            binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
147            multiBinding.Bindings.Add(binding);
148
149            binding = new Binding();
150            binding.Source = connectable;
151            binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
152            multiBinding.Bindings.Add(binding);
153
154            return multiBinding;
155        }
156
157        #region Controls
158
159        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
160        {
161            if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
162            {
163                this.root.Children.Remove(dummyLine);
164                this.AddConnection(selectedConnector, e.connector);
165                this.selectedConnector = null;
166                this.State = EditorState.READY;
167                return;
168            }
169
170            if (selectedConnector == null && e.connector.Model.Outgoing)
171            {
172                this.root.Children.Add(dummyLine);
173                this.selectedConnector = e.connector;
174                this.AddConnectionSource(e.connector, dummyLine);
175                this.State = EditorState.BUSY;
176                return;
177            }
178           
179        }
180
181        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
182        {
183            this.selectedConnector = null;
184            this.root.Children.Remove(dummyLine);
185        }
186
187        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
188        {
189            this.selectedPluginContainer = null;
190            this.State = EditorState.READY;
191        }
192
193        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
194        {
195            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
196            {
197                point = selectedPluginContainer.GetPosition();
198                this.selectedPluginContainer.SetPosition(new Point(point.X + Mouse.GetPosition(root).X - previousDragPoint.X, point.Y + Mouse.GetPosition(root).Y - previousDragPoint.Y));
199            }
200
201            if (selectedConnector != null && root.Children.Contains(dummyLine))
202            {
203                this.dummyLine.EndPoint = Mouse.GetPosition(root);
204            }
205            this.previousDragPoint = Mouse.GetPosition(root);
206        }
207
208        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
209        {
210            Canvas.SetZIndex(sender as PluginContainerView, 100);
211            this.selectedPluginContainer = null;
212            this.State = EditorState.BUSY;
213        }
214
215        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
216        {
217            Canvas.SetZIndex(sender as PluginContainerView, 101);
218            this.selectedPluginContainer = sender as PluginContainerView;
219            this.State = EditorState.BUSY;
220            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
221            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
222        }
223
224        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
225        {
226            DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
227            PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
228            if(obj != null)
229                this.AddPluginContainerView(e.GetPosition(root), pluginModel);
230        }
231
232        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
233        {
234            e.Effects = DragDropEffects.Copy;
235        }
236
237        #endregion
238
239        private void CloseSettingsButton_Click(object sender, RoutedEventArgs e)
240        {
241            this.InformationPanel.Visibility = Visibility.Hidden;
242        }
243    }
244}
Note: See TracBrowser for help on using the repository browser.