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

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

-ProgresBar added
-few updates added
-Orthogonal PolyLines added(experimental)

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