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

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

-Mandatory Connector now indicated by the red border
-Textbox added for custom description
-Major Style changes
-Icon updated
-WorkSpace Scrolling now Possible

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