source: trunk/CrypPlugins/WorkspaceManager/View/Container/IControlContainer.xaml.cs @ 2118

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

-LogPresentation completely new designed
-Usability improved
-Style Changed

File size: 11.6 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.Model;
15using WorkspaceManager.View.VisualComponents;
16using WorkspaceManager.View.Converter;
17using Cryptool.PluginBase.Editor;
18using Cryptool.PluginBase;
19
20namespace WorkspaceManager.View.Container
21{
22    /// <summary>
23    /// Interaction logic for IControlContainer.xaml
24    /// </summary>
25    public partial class IControlContainer : UserControl
26    {
27        public PluginModel Model { get; set; }
28        public EditorState State { get; set; }
29        public List<CryptoLineView> IControlConnList { get; set; }
30
31        private ConnectorView selectedConnector;
32        private CryptoLineView dummyLine;
33        private PluginContainerView selectedPluginContainer;
34        private Point previousDragPoint;
35        private Point dummyPoint;
36
37        public IControlContainer()
38        {
39            InitializeComponent();
40        }
41
42        public IControlContainer(PluginModel Model)
43        {
44            InitializeComponent();
45            this.dummyLine = new CryptoLineView();
46            this.Model = Model;
47            setBaseControl(Model.WorkspaceModel);
48        }
49
50        private void setBaseControl(WorkspaceModel WorkspaceModel)
51        {
52            //this.MouseLeftButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_OnMouseLeftButtonDown);
53            this.MouseLeave += new MouseEventHandler(WorkSpaceEditorView_MouseLeave);
54            this.Drop += new DragEventHandler(WorkSpaceEditorView_Drop);
55            this.MouseMove += new MouseEventHandler(WorkSpaceEditorView_MouseMove);
56            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_PreviewMouseRightButtonDown);
57            this.State = EditorState.READY;
58        }
59
60        public void AddConnection(ConnectorView source, ConnectorView target)
61        {
62            if (this.State == EditorState.READY)
63            {
64                ConnectionModel connectionModel = this.Model.WorkspaceModel.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
65                CryptoLineView conn = new CryptoLineView(connectionModel);
66                connectionModel.OnDelete += DeleteConnection;
67                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
68                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
69                root.Children.Add(conn);
70                IControlConnList.Add(conn);
71                Canvas.SetZIndex(conn, 0);
72            }
73        }
74
75        public void DeleteConnection(Object sender, EventArgs args)
76        {
77            if (sender is ConnectionModel)
78            {
79                if (((ConnectionModel)sender).UpdateableView != null)
80                {
81                    UIElement uielement = (UIElement)((ConnectionModel)sender).UpdateableView;
82                    root.Children.Remove(uielement);
83                }
84            }
85        }
86
87        private void AddConnectionSource(ConnectorView source, CryptoLineView conn)
88        {
89            if (this.State == EditorState.READY)
90            {
91                Color color = ColorHelper.GetColor((source as ConnectorView).Model.ConnectorType);
92                conn.Stroke = new SolidColorBrush(color);
93                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
94                conn.EndPoint = Mouse.GetPosition(this);
95            }
96        }
97
98        private MultiBinding CreateConnectorBinding(ConnectorView connectable)
99        {
100            MultiBinding multiBinding = new MultiBinding();
101            multiBinding.Converter = new ConnectorBindingConverter();
102            multiBinding.ConverterParameter = connectable;
103
104            //Binding binding = new Binding();
105            //binding.Source = connectable;
106            //binding.Path = new PropertyPath(ConnectorView.X);
107            //multiBinding.Bindings.Add(binding);
108
109            //binding = new Binding();
110            //binding.Source = connectable;
111            //binding.Path = new PropertyPath(ConnectorView.Y);
112            //multiBinding.Bindings.Add(binding);
113
114            //binding = new Binding();
115            //binding.Source = connectable;
116            //binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
117            //multiBinding.Bindings.Add(binding);
118
119            //binding = new Binding();
120            //binding.Source = connectable;
121            //binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
122            //multiBinding.Bindings.Add(binding);
123
124
125            return multiBinding;
126        }
127
128        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
129        {
130            if (this.State == EditorState.READY)
131            {
132                if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
133                {
134                    this.root.Children.Remove(dummyLine);
135                    this.AddConnection(selectedConnector, e.connector);
136                    this.selectedConnector = null;
137                    return;
138                }
139
140                if (selectedConnector == null && e.connector.Model.Outgoing)
141                {
142                    this.root.Children.Add(dummyLine);
143                    this.selectedConnector = e.connector;
144                    this.AddConnectionSource(e.connector, dummyLine);
145                    return;
146                }
147            }
148        }
149
150        void PluginDelete(object sender, PluginContainerViewDeleteViewEventArgs e)
151        {
152            if (this.State == EditorState.READY)
153            {
154                Model.WorkspaceModel.deletePluginModel(e.container.Model);
155                root.Children.Remove(e.container);
156                Model.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
157            }
158        }
159
160        public void AddPluginContainerView(Point position, PluginModel model)
161        {
162            if (this.State == EditorState.READY)
163            {
164                PluginContainerView newPluginContainerView = new PluginContainerView(model);
165                newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
166                newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
167                newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
168                newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
169                newPluginContainerView.SetPosition(new Point((Math.Round((position.X) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
170                                                            (Math.Round((position.Y) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
171
172                this.root.Children.Add(newPluginContainerView);
173                Canvas.SetZIndex(newPluginContainerView, 100);
174                Model.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
175            }
176        }
177
178        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
179        {
180            if (this.State == EditorState.READY)
181            {
182                if (e.Data.GetDataPresent("Cryptool.PluginBase.Editor.DragDropDataObject"))
183                {
184                    try
185                    {
186                        DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
187                        PluginModel pluginModel = Model.WorkspaceModel.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
188                        if (obj != null)
189                            this.AddPluginContainerView(e.GetPosition(root), pluginModel);
190                        Model.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
191                    }
192                    catch (Exception ex)
193                    {
194                        this.Model.WorkspaceModel.WorkspaceManagerEditor.GuiLogMessage("Could not add Plugin to Workspace:" + ex.Message, NotificationLevel.Error);
195                        this.Model.WorkspaceModel.WorkspaceManagerEditor.GuiLogMessage(ex.StackTrace, NotificationLevel.Error);
196                        return;
197                    }
198                }
199                else
200                    return;
201            }
202        }
203
204        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
205        {
206            this.selectedPluginContainer = sender as PluginContainerView;
207            this.previousDragPoint = Mouse.GetPosition(selectedPluginContainer);
208            Canvas.SetZIndex(selectedPluginContainer, 101);
209
210            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
211            this.Model.WorkspaceModel.WorkspaceManagerEditor.onSelectedPluginChanged(args);
212
213            e.Handled = true;
214        }
215
216        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
217        {
218            if (this.State == EditorState.READY)
219            {
220                this.selectedPluginContainer = null;
221            }
222        }
223
224        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
225        {
226            if (e.LeftButton == MouseButtonState.Pressed && selectedPluginContainer != null)
227            {
228                dummyPoint = selectedPluginContainer.GetPosition();
229                this.selectedPluginContainer.SetPosition(new Point((Math.Round((Mouse.GetPosition(root).X - previousDragPoint.X) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
230                                                            (Math.Round((Mouse.GetPosition(root).Y - previousDragPoint.Y) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
231                Model.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
232                //this.selectedPluginContainer.SetPosition(new Point((Math.Round(( Mouse.GetPosition(root).X )/Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
233                //                                            (Math.Round(( Mouse.GetPosition(root).Y ) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
234            }
235
236
237
238            if (selectedConnector != null && root.Children.Contains(dummyLine))
239            {
240                this.dummyLine.EndPoint = Mouse.GetPosition(root);
241            }
242        }
243
244        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
245        {
246            Canvas.SetZIndex(sender as PluginContainerView, 100);
247            this.selectedPluginContainer = null;
248        }
249
250
251        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
252        {
253            if (this.State == EditorState.READY)
254            {
255                this.selectedConnector = null;
256                this.root.Children.Remove(dummyLine);
257            }
258        }
259    }
260}
Note: See TracBrowser for help on using the repository browser.