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