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

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

-Slight style changes
-settings now is now ~80% working
-tooltip added

File size: 18.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    public enum EditorState
25    {
26        READY,
27        BUSY
28    };
29    /// <summary>
30    /// Interaction logic for WorkSpaceEditorView.xaml
31    /// </summary>
32    ///
33    public partial class WorkSpaceEditorView : UserControl
34    {
35        private double prevX = 0, prevY = 0;
36        private bool IsDragStarted;
37        private Point previousDragPoint = new Point();
38        private ConnectorView selectedConnector;
39        private PluginContainerView selectedPluginContainer;
40        private CryptoLineView dummyLine = new CryptoLineView();
41        private Point point;
42        private PluginContainerView currentFullViewContainer;
43        private Panel root { get { return (this.ViewBox.Content as Panel); } }
44        private BottomBox bottomBox { get { return (BottomBoxParent.Child as BottomBox); } }
45
46        public UserContentWrapper UserContentWrapper { get; set; }
47        public EditorState State;
48        public EditorState ConnectorState;
49        public List<CryptoLineView> ConnectionList = new List<CryptoLineView>();
50        public List<PluginContainerView> PluginContainerList = new List<PluginContainerView>();
51        private WorkspaceModel model;
52        public WorkspaceModel Model
53        {
54            get { return model; }
55            set { model = value; }
56        }
57
58        public WorkSpaceEditorView()
59        {
60            InitializeComponent();
61        }
62
63        public WorkSpaceEditorView(WorkspaceModel WorkspaceModel)
64        {
65            setBaseControl(WorkspaceModel);                       
66            InitializeComponent();
67            ViewBox.DataContext = root;
68            this.bottomBox.FitToScreen += new EventHandler<FitToScreenEventArgs>(bottomBox_FitToScreen);
69            this.UserContentWrapper = new UserContentWrapper(WorkspaceModel, bottomBox);
70            this.UserControlWrapperParent.Children.Clear();
71            this.UserControlWrapperParent.Children.Add(UserContentWrapper);       
72        }
73
74        void bottomBox_FitToScreen(object sender, FitToScreenEventArgs e)
75        {
76
77            if (root.Children.Count != 0)
78            {
79                if (root.DesiredSize.Height < ViewBoxParent.ActualHeight)
80                    Properties.Settings.Default.EditScale = ViewBoxParent.ActualHeight / root.DesiredSize.Height;
81
82                if (root.DesiredSize.Width < ViewBoxParent.ActualWidth)
83                    Properties.Settings.Default.EditScale = ViewBoxParent.ActualWidth / root.DesiredSize.Width;
84                this.UpdateLayout();
85                if (root.ActualWidth > root.ActualHeight)
86                {
87                    this.UpdateLayout();
88                    Properties.Settings.Default.EditScale = ViewBoxParent.ActualWidth / root.ActualWidth;
89                    return;
90                }
91                else if (root.ActualWidth < root.ActualHeight)
92                {
93
94                    this.UpdateLayout();
95                    Properties.Settings.Default.EditScale = ViewBoxParent.ActualHeight / root.ActualHeight;
96                    return;
97                } 
98            }
99        }
100
101        private void setBaseControl(WorkspaceModel WorkspaceModel)
102        {
103            //this.MouseLeftButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_OnMouseLeftButtonDown);
104            this.MouseLeave += new MouseEventHandler(WorkSpaceEditorView_MouseLeave);
105            this.Loaded += new RoutedEventHandler(WorkSpaceEditorView_Loaded);
106            this.DragEnter += new DragEventHandler(WorkSpaceEditorView_DragEnter);
107            this.Drop += new DragEventHandler(WorkSpaceEditorView_Drop);
108            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(WorkSpaceEditorView_PreviewMouseRightButtonDown);
109            this.Model = WorkspaceModel;
110            this.State = EditorState.READY;
111        }
112
113        void PluginDelete(object sender, PluginContainerViewDeleteViewEventArgs e)
114        {
115            if (this.State == EditorState.READY)
116            {
117                Model.deletePluginModel(e.container.Model);
118                root.Children.Remove(e.container);
119                Model.WorkspaceManagerEditor.HasChanges = true;
120            }
121        }
122
123        void WorkSpaceEditorView_Loaded(object sender, RoutedEventArgs e)
124        {
125        }
126
127        public void AddPluginContainerView(Point position, PluginModel model)
128        {
129            if (this.State == EditorState.READY)
130            {
131                PluginContainerView newPluginContainerView = new PluginContainerView(model);
132                newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
133                newPluginContainerView.FullScreen += new EventHandler<PluginContainerViewFullScreenViewEventArgs>(shape_FullScreen);
134                newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
135                newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
136                newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
137                newPluginContainerView.SetPosition(new Point((Math.Round((position.X) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale,
138                                                            (Math.Round((position.Y) / Properties.Settings.Default.GridScale)) * Properties.Settings.Default.GridScale));
139
140                this.root.Children.Add(newPluginContainerView);
141                Canvas.SetZIndex(newPluginContainerView, 100);
142                Model.WorkspaceManagerEditor.HasChanges = true;
143            }
144        }
145
146
147        void shape_FullScreen(object sender, PluginContainerViewFullScreenViewEventArgs e)
148        {
149            this.InformationPanel.Visibility = Visibility.Visible;
150            e.container.PrepareFullscreen();
151            this.PercentageTextPanel.Children.Add(e.container.ProgressPercentage);
152            this.PrstPanel.DataContext = e.container;
153            this.CtrPanel.DataContext = e.container;
154            this.CtrPanel.Children.Add(e.container.OptionPanel);
155            this.PrstPanel.Children.Add(e.container.ViewPanel);
156            this.ProgressbarPanel.Children.Add(e.container.ProgressbarParent);
157            this.currentFullViewContainer = e.container;
158        }
159
160        public void AddConnection(ConnectorView source, ConnectorView target)
161        {
162            if (this.State == EditorState.READY)
163            {
164                ConnectionModel connectionModel = this.Model.newConnectionModel(((ConnectorView)source).Model, ((ConnectorView)target).Model, ((ConnectorView)source).Model.ConnectorType);
165                CryptoLineView conn = new CryptoLineView(connectionModel);
166                conn.StartPointSource = source;
167                conn.EndPointSource = target;
168                connectionModel.UpdateableView = conn;
169                connectionModel.OnDelete += DeleteConnection;
170                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
171                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(target));
172                root.Children.Add(conn);
173                ConnectionList.Add(conn);
174                Canvas.SetZIndex(conn, 0);
175            }
176        }
177
178        public void DeleteConnection(Object sender, EventArgs args)
179        {
180            if (sender is ConnectionModel)
181            {
182                if(((ConnectionModel)sender).UpdateableView != null){
183                    UIElement uielement = (UIElement)((ConnectionModel)sender).UpdateableView;
184                    root.Children.Remove(uielement);
185                }
186            }
187        }
188
189        private void AddConnectionSource(ConnectorView source, CryptoLineView conn)
190        {
191            if (this.State == EditorState.READY)
192            {
193                Color color = ColorHelper.GetColor((source as ConnectorView).Model.ConnectorType);
194                conn.Stroke = new SolidColorBrush(color);
195                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(source));
196                conn.EndPoint = Mouse.GetPosition(this);
197            }
198        }
199
200        private MultiBinding CreateConnectorBinding(ConnectorView connectable)
201        {
202            MultiBinding multiBinding = new MultiBinding();
203            multiBinding.Converter = new ConnectorBindingConverter();
204            multiBinding.ConverterParameter = connectable;
205
206            Binding binding = new Binding();
207            binding.Source = connectable;
208            binding.Path = new PropertyPath(ConnectorView.X);
209            multiBinding.Bindings.Add(binding);
210
211            binding = new Binding();
212            binding.Source = connectable;
213            binding.Path = new PropertyPath(ConnectorView.Y);
214            multiBinding.Bindings.Add(binding);
215
216            binding = new Binding();
217            binding.Source = connectable;
218            binding.Path = new PropertyPath(FrameworkElement.ActualHeightProperty);
219            multiBinding.Bindings.Add(binding);
220
221            binding = new Binding();
222            binding.Source = connectable;
223            binding.Path = new PropertyPath(FrameworkElement.ActualWidthProperty);
224            multiBinding.Bindings.Add(binding);
225
226
227            return multiBinding;
228        }
229
230        #region Controls
231
232        //void WorkSpaceEditorView_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
233        //{
234        //    UserContentWrapper.SelectedItem = null;
235        //    PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
236        //    this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
237        //    e.Handled = false;
238        //}
239
240        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
241        {
242            if (this.State == EditorState.READY)
243            {
244                if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
245                {
246                    this.root.Children.Remove(dummyLine);
247                    this.AddConnection(selectedConnector, e.connector);
248                    this.selectedConnector = null;
249                    return;
250                }
251
252                if (selectedConnector == null && e.connector.Model.Outgoing)
253                {
254                    this.root.Children.Add(dummyLine);
255                    this.selectedConnector = e.connector;
256                    this.AddConnectionSource(e.connector, dummyLine);
257                    return;
258                }
259            }
260           
261        }
262
263        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
264        {
265            UserContentWrapper.SelectedItem = null;
266
267            if (this.State == EditorState.READY)
268            {
269                this.selectedConnector = null;
270                this.root.Children.Remove(dummyLine);
271            }
272        }
273
274        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
275        {
276            if (this.State == EditorState.READY)
277            {
278                this.selectedPluginContainer = null;
279            }
280        }     
281
282        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
283        {
284            this.dummyLine.EndPoint = Mouse.GetPosition(root);
285            previousDragPoint = e.GetPosition(root);
286        }
287
288        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
289        {
290            Canvas.SetZIndex(sender as PluginContainerView, 100);
291            this.selectedPluginContainer = null;
292        }
293
294        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
295        {
296            this.selectedPluginContainer = sender as PluginContainerView;
297            this.previousDragPoint = Mouse.GetPosition(selectedPluginContainer); 
298            Canvas.SetZIndex(selectedPluginContainer, 101);
299
300            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
301            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
302
303            e.Handled = true;
304        }
305
306        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
307        {
308            if (this.State == EditorState.READY)
309            {
310                if (e.Data.GetDataPresent("Cryptool.PluginBase.Editor.DragDropDataObject"))
311                {
312                    try
313                    {
314                        DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
315                        PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
316                        if (obj != null)
317                            this.AddPluginContainerView(e.GetPosition(root), pluginModel);
318                        Model.WorkspaceManagerEditor.HasChanges = true;
319                    }
320                    catch (Exception ex)
321                    {
322                        this.Model.WorkspaceManagerEditor.GuiLogMessage("Could not add Plugin to Workspace:" + ex.Message, NotificationLevel.Error);
323                        this.Model.WorkspaceManagerEditor.GuiLogMessage(ex.StackTrace, NotificationLevel.Error);
324                        return;
325                    }
326                }
327                else
328                    return;
329            }
330        }
331
332        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
333        {
334            if (this.State == EditorState.READY)
335            {
336                e.Effects = DragDropEffects.Copy;
337            }
338            else if (this.State == EditorState.BUSY)
339            {
340                e.Effects = DragDropEffects.None;
341            }
342        }
343
344        #endregion
345
346        private void CloseButton_Click(object sender, RoutedEventArgs e)
347        {
348            this.InformationPanel.Visibility = Visibility.Collapsed;
349            this.CtrPanel.Children.Clear();
350            this.PrstPanel.Children.Clear();
351            this.ProgressbarPanel.Children.Clear();
352            this.PercentageTextPanel.Children.Clear();
353            this.currentFullViewContainer.Reset();
354            this.currentFullViewContainer = null;
355            this.CtrPanel.DataContext = null;
356            this.PrstPanel.DataContext = null;
357        }
358
359        internal void Load(WorkspaceModel WorkspaceModel)
360        {
361            this.Model = WorkspaceModel;   
362
363            foreach (PluginModel model in this.Model.AllPluginModels)
364            {
365                this.loadPluginContainerView(model);
366            }
367            foreach (ConnectionModel connModel in WorkspaceModel.AllConnectionModels)
368            {
369                CryptoLineView conn = new CryptoLineView(connModel);
370                connModel.UpdateableView = conn;
371                connModel.OnDelete += DeleteConnection;
372
373                foreach (UIElement element in root.Children)
374                {
375                    PluginContainerView container = element as PluginContainerView;
376                    if (container != null)
377                    {
378                        foreach (ConnectorView connector in container.ConnectorViewList)
379                        {
380                            if (connModel.From == connector.Model)
381                            {
382                                conn.StartPointSource = connector;
383                                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(connector));
384                            }
385                            else if (connModel.To == connector.Model)
386                            {
387                                conn.EndPointSource = connector;
388                                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(connector));
389                            }
390                        }
391                    }
392                }
393
394                root.Children.Add(conn);
395                ConnectionList.Add(conn);
396                Canvas.SetZIndex(conn, 0);
397            }
398        }
399
400        private void loadPluginContainerView(PluginModel model)
401        {
402            PluginContainerView newPluginContainerView = new PluginContainerView(model);
403
404            newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
405            newPluginContainerView.FullScreen += new EventHandler<PluginContainerViewFullScreenViewEventArgs>(shape_FullScreen);
406            newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
407            newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
408            newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
409            newPluginContainerView.SetPosition(model.Position);
410            this.root.Children.Add(newPluginContainerView);
411            Canvas.SetZIndex(newPluginContainerView, 100);
412        }
413
414        internal void ResetConnections()
415        {
416            foreach (CryptoLineView line in ConnectionList)
417            {
418                line.Reset();
419            }
420        }
421
422        private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
423        {
424            if (!e.Handled)
425            {
426                PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
427                this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
428            }
429        }
430
431        private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
432        {
433            double y = e.VerticalChange, x = e.HorizontalChange;
434
435            ViewBox.ScrollToHorizontalOffset(x);
436            ViewBox.ScrollToVerticalOffset(y);
437        }
438
439        private void Thumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
440        {
441        }
442    }
443}
Note: See TracBrowser for help on using the repository browser.