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

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

-added Animations
-added Arrow Image
-Some style changes

File size: 10.0 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            root.Children.Remove(e.container);
86        }
87
88        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
89        {
90
91        }
92
93        public void AddPluginContainerView(Point position, PluginModel model)
94        {
95            PluginContainerView shape = new PluginContainerView(model);
96            shape.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
97            shape.ShowSettings += new EventHandler<PluginContainerViewSettingsViewEventArgs>(shape_ShowSettings);
98            shape.OnConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
99            shape.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
100            shape.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
101            shape.SetPosition(position);
102            this.root.Children.Add(shape);
103            Canvas.SetZIndex(shape, 100);
104        }
105
106        void shape_ShowSettings(object sender, PluginContainerViewSettingsViewEventArgs e)
107        {
108            this.InformationPanel.Visibility = Visibility.Visible;
109        }
110
111        public void AddConnection(IConnectable source, IConnectable target)
112        {
113            ConnectionModel connectionModel = this.Model.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
114            CryptoLineView conn = new CryptoLineView(connectionModel);
115            conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
116            conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
117            root.Children.Add(conn);
118            ConnectionList.Add(conn);
119            Canvas.SetZIndex(conn, 0);           
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 shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
161        {
162            if (selectedConnector != null && e.connector.Model.ConnectorType.Name == selectedConnector.Model.ConnectorType.Name)
163            {
164                this.root.Children.Remove(dummyLine);
165                this.AddConnection(selectedConnector, e.connector);
166                this.selectedConnector = null;
167                this.State = EditorState.READY;
168                return;
169            }
170
171            if (selectedConnector == null)
172            {
173                this.root.Children.Add(dummyLine);
174                this.selectedConnector = e.connector;
175                this.AddConnectionSource(e.connector, dummyLine);
176                this.State = EditorState.BUSY;
177                return;
178            }
179           
180        }
181
182        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
183        {
184            this.selectedConnector = null;
185            this.root.Children.Remove(dummyLine);
186        }
187
188        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
189        {
190            this.selectedPluginContainer = null;
191            this.State = EditorState.READY;
192        }
193
194        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
195        {
196            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
197            {
198                p = selectedPluginContainer.GetPosition();
199                this.selectedPluginContainer.SetPosition(new Point(p.X + Mouse.GetPosition(root).X - previousDragPoint.X, p.Y + Mouse.GetPosition(root).Y - previousDragPoint.Y));
200            }
201
202            if (selectedConnector != null && root.Children.Contains(dummyLine))
203            {
204                this.dummyLine.EndPoint = Mouse.GetPosition(root);
205            }
206            this.previousDragPoint = Mouse.GetPosition(root);
207        }
208
209        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
210        {
211            Canvas.SetZIndex(sender as PluginContainerView, 100);
212            this.selectedPluginContainer = null;
213            this.State = EditorState.BUSY;
214        }
215
216        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
217        {
218            Canvas.SetZIndex(sender as PluginContainerView, 101);
219            this.selectedPluginContainer = sender as PluginContainerView;
220            this.State = EditorState.BUSY;
221        }
222
223        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
224        {
225            DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
226            if(obj != null)
227                this.AddPluginContainerView(e.GetPosition(root), Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName)));
228        }
229
230        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
231        {
232            e.Effects = DragDropEffects.Copy;
233        }
234
235        #endregion
236
237        private void CloseSettingsButton_Click(object sender, RoutedEventArgs e)
238        {
239            this.InformationPanel.Visibility = Visibility.Hidden;
240        }
241    }
242}
Note: See TracBrowser for help on using the repository browser.