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

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

-Major Style changes
-Fit to Screen added

File size: 18.8 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.DesiredSize.Height < ViewBoxParent.ActualHeight)
78                Properties.Settings.Default.EditScale = ViewBoxParent.ActualHeight / root.DesiredSize.Height;
79
80            if (root.DesiredSize.Width < ViewBoxParent.ActualWidth)
81                Properties.Settings.Default.EditScale = ViewBoxParent.ActualWidth / root.DesiredSize.Width;
82            this.UpdateLayout();
83            if (root.ActualWidth > root.ActualHeight)
84            {
85                this.UpdateLayout();
86                Properties.Settings.Default.EditScale = ViewBoxParent.ActualWidth / root.ActualWidth;
87                return;
88            }
89            else if (root.ActualWidth < root.ActualHeight)
90            {
91
92                this.UpdateLayout();
93                Properties.Settings.Default.EditScale = ViewBoxParent.ActualHeight / root.ActualHeight ;
94                return;
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;
205            binding.Path = new PropertyPath(ConnectorView.X);
206            multiBinding.Bindings.Add(binding);
207
208            binding = new Binding();
209            binding.Source = connectable;
210            binding.Path = new PropertyPath(ConnectorView.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
224            return multiBinding;
225        }
226
227        #region Controls
228
229        //void WorkSpaceEditorView_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
230        //{
231        //    UserContentWrapper.SelectedItem = null;
232        //    PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
233        //    this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
234        //    e.Handled = false;
235        //}
236
237        void shape_OnConnectorMouseLeftButtonDown(object sender, ConnectorViewEventArgs e)
238        {
239            if (this.State == EditorState.READY)
240            {
241                if (selectedConnector != null && WorkspaceModel.compatibleConnectors(selectedConnector.Model, e.connector.Model))
242                {
243                    this.root.Children.Remove(dummyLine);
244                    this.AddConnection(selectedConnector, e.connector);
245                    this.selectedConnector = null;
246                    return;
247                }
248
249                if (selectedConnector == null && e.connector.Model.Outgoing)
250                {
251                    this.root.Children.Add(dummyLine);
252                    this.selectedConnector = e.connector;
253                    this.AddConnectionSource(e.connector, dummyLine);
254                    return;
255                }
256            }
257           
258        }
259
260        void WorkSpaceEditorView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
261        {
262            UserContentWrapper.SelectedItem = null;
263
264            if (this.State == EditorState.READY)
265            {
266                this.selectedConnector = null;
267                this.root.Children.Remove(dummyLine);
268            }
269        }
270
271        void WorkSpaceEditorView_MouseLeave(object sender, MouseEventArgs e)
272        {
273            if (this.State == EditorState.READY)
274            {
275                this.selectedPluginContainer = null;
276            }
277        }     
278
279        void WorkSpaceEditorView_MouseMove(object sender, MouseEventArgs e)
280        {
281            this.dummyLine.EndPoint = Mouse.GetPosition(root);
282            previousDragPoint = e.GetPosition(root);
283        }
284
285        void shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
286        {
287            Canvas.SetZIndex(sender as PluginContainerView, 100);
288            this.selectedPluginContainer = null;
289        }
290
291        void shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
292        {
293            this.selectedPluginContainer = sender as PluginContainerView;
294            this.previousDragPoint = Mouse.GetPosition(selectedPluginContainer); 
295            Canvas.SetZIndex(selectedPluginContainer, 101);
296
297            PluginChangedEventArgs args = new PluginChangedEventArgs(this.selectedPluginContainer.Model.Plugin, this.selectedPluginContainer.Model.Name, DisplayPluginMode.Normal);
298            this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
299
300            e.Handled = true;
301        }
302
303        void WorkSpaceEditorView_Drop(object sender, DragEventArgs e)
304        {
305            if (this.State == EditorState.READY)
306            {
307                if (e.Data.GetDataPresent("Cryptool.PluginBase.Editor.DragDropDataObject"))
308                {
309                    try
310                    {
311                        DragDropDataObject obj = e.Data.GetData("Cryptool.PluginBase.Editor.DragDropDataObject") as DragDropDataObject;
312                        PluginModel pluginModel = Model.newPluginModel(DragDropDataObjectToPluginConverter.CreatePluginInstance(obj.AssemblyFullName, obj.TypeFullName));
313                        if (obj != null)
314                            this.AddPluginContainerView(e.GetPosition(root), pluginModel);
315                        Model.WorkspaceManagerEditor.HasChanges = true;
316                    }
317                    catch (Exception ex)
318                    {
319                        this.Model.WorkspaceManagerEditor.GuiLogMessage("Could not add Plugin to Workspace:" + ex.Message, NotificationLevel.Error);
320                        this.Model.WorkspaceManagerEditor.GuiLogMessage(ex.StackTrace, NotificationLevel.Error);
321                        return;
322                    }
323                }
324                else
325                    return;
326            }
327        }
328
329        void WorkSpaceEditorView_DragEnter(object sender, DragEventArgs e)
330        {
331            if (this.State == EditorState.READY)
332            {
333                e.Effects = DragDropEffects.Copy;
334            }
335            else if (this.State == EditorState.BUSY)
336            {
337                e.Effects = DragDropEffects.None;
338            }
339        }
340
341        #endregion
342
343        private void CloseButton_Click(object sender, RoutedEventArgs e)
344        {
345            this.InformationPanel.Visibility = Visibility.Collapsed;
346            this.CtrPanel.Children.Clear();
347            this.PrstPanel.Children.Clear();
348            this.ProgressbarPanel.Children.Clear();
349            this.PercentageTextPanel.Children.Clear();
350            this.currentFullViewContainer.Reset();
351            this.currentFullViewContainer = null;
352            this.CtrPanel.DataContext = null;
353            this.PrstPanel.DataContext = null;
354        }
355
356        internal void Load(WorkspaceModel WorkspaceModel)
357        {
358            this.Model = WorkspaceModel;   
359
360            foreach (PluginModel model in this.Model.AllPluginModels)
361            {
362                this.loadPluginContainerView(model);
363            }
364            foreach (ConnectionModel connModel in WorkspaceModel.AllConnectionModels)
365            {
366                CryptoLineView conn = new CryptoLineView(connModel);
367                connModel.UpdateableView = conn;
368                connModel.OnDelete += DeleteConnection;
369
370                foreach (UIElement element in root.Children)
371                {
372                    PluginContainerView container = element as PluginContainerView;
373                    if (container != null)
374                    {
375                        foreach (ConnectorView connector in container.ConnectorViewList)
376                        {
377                            if (connModel.From == connector.Model)
378                            {
379                                conn.StartPointSource = connector;
380                                conn.SetBinding(CryptoLineView.StartPointProperty, CreateConnectorBinding(connector));
381                            }
382                            else if (connModel.To == connector.Model)
383                            {
384                                conn.EndPointSource = connector;
385                                conn.SetBinding(CryptoLineView.EndPointProperty, CreateConnectorBinding(connector));
386                            }
387                        }
388                    }
389                }
390
391                root.Children.Add(conn);
392                ConnectionList.Add(conn);
393                Canvas.SetZIndex(conn, 0);
394            }
395        }
396
397        private void loadPluginContainerView(PluginModel model)
398        {
399            PluginContainerView newPluginContainerView = new PluginContainerView(model);
400
401            newPluginContainerView.Delete += new EventHandler<PluginContainerViewDeleteViewEventArgs>(PluginDelete);
402            newPluginContainerView.FullScreen += new EventHandler<PluginContainerViewFullScreenViewEventArgs>(shape_FullScreen);
403            newPluginContainerView.ConnectorMouseLeftButtonDown += new EventHandler<ConnectorViewEventArgs>(shape_OnConnectorMouseLeftButtonDown);
404            newPluginContainerView.MouseLeftButtonDown += new MouseButtonEventHandler(shape_MouseLeftButtonDown);
405            newPluginContainerView.MouseLeftButtonUp += new MouseButtonEventHandler(shape_MouseLeftButtonUp);
406            newPluginContainerView.SetPosition(model.Position);
407            this.root.Children.Add(newPluginContainerView);
408            Canvas.SetZIndex(newPluginContainerView, 100);
409        }
410
411        internal void ResetConnections()
412        {
413            foreach (CryptoLineView line in ConnectionList)
414            {
415                line.Reset();
416            }
417        }
418
419        private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
420        {
421            if (!e.Handled)
422            {
423                PluginChangedEventArgs args = new PluginChangedEventArgs(this.model.WorkspaceManagerEditor, "WorkspaceManager", DisplayPluginMode.Normal);
424                this.Model.WorkspaceManagerEditor.onSelectedPluginChanged(args);
425            }
426        }
427
428        private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
429        {
430            double y = e.VerticalChange, x = e.HorizontalChange;
431
432            ViewBox.ScrollToHorizontalOffset(x);
433            ViewBox.ScrollToVerticalOffset(y);
434        }
435
436        private void Thumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
437        {
438        }
439    }
440}
Note: See TracBrowser for help on using the repository browser.