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

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

-Fullscreen enhanced
-TextInput added
-Picture scaling added
-Textinput scaling added
-Textinput format command added
-Several style changes
-Progressbar redesigned
-Last log message now appearing
-IControlContainer commenced
-Several icons added
-Plugin state now stored and loaded
-Plugin height and width now storing and loading
-Several misc changes

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