From e352c4e5f742585e4feeb2ca3183bd4d0282a567 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Thu, 14 Dec 2017 14:43:25 +0200 Subject: Implemented new MDI Container Control ! --- .../Controls/MdiChild.cs | 58 ++++++++++++ .../Controls/MdiContainerControl.xaml | 75 +++++++++++++++ .../Controls/MdiContainerControl.xaml.cs | 102 +++++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls') diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs new file mode 100644 index 000000000..469e3fda5 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs @@ -0,0 +1,58 @@ +using MaterialDesignThemes.Wpf; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Tango.Core.Commands; + +namespace Tango.MachineStudio.Common.Controls +{ + public class MdiChild : DependencyObject + { + public MdiChild() + { + + } + + public MdiChild(String header, FrameworkElement view) : this() + { + Header = header; + View = view; + } + + public PackIconKind Icon + { + get { return (PackIconKind)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + public static readonly DependencyProperty IconProperty = + DependencyProperty.Register("Icon", typeof(PackIconKind), typeof(MdiChild), new PropertyMetadata(PackIconKind.LaptopWindows)); + + public String Header + { + get { return (String)GetValue(HeaderProperty); } + set { SetValue(HeaderProperty, value); } + } + public static readonly DependencyProperty HeaderProperty = + DependencyProperty.Register("Header", typeof(String), typeof(MdiChild), new PropertyMetadata(null)); + + public FrameworkElement View + { + get { return (FrameworkElement)GetValue(ViewProperty); } + set { SetValue(ViewProperty, value); } + } + public static readonly DependencyProperty ViewProperty = + DependencyProperty.Register("View", typeof(FrameworkElement), typeof(MdiChild), new PropertyMetadata(null)); + + public Point Location + { + get { return (Point)GetValue(LocationProperty); } + set { SetValue(LocationProperty, value); } + } + public static readonly DependencyProperty LocationProperty = + DependencyProperty.Register("Location", typeof(Point), typeof(MdiChild), new PropertyMetadata(new Point())); + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml new file mode 100644 index 000000000..3896347fe --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs new file mode 100644 index 000000000..dbf4ee74b --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Tango.SharedUI.Helpers; + +namespace Tango.MachineStudio.Common.Controls +{ + /// + /// Interaction logic for MdiContainerControl.xaml + /// + public partial class MdiContainerControl : UserControl + { + private const int MIN_SIZE = 200; + + public MdiContainerControl() + { + InitializeComponent(); + } + + public IEnumerable ItemsSource + { + get { return (IEnumerable)GetValue(ItemsSourceProperty); } + set { SetValue(ItemsSourceProperty, value); } + } + public static readonly DependencyProperty ItemsSourceProperty = + DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(MdiContainerControl), new PropertyMetadata(null)); + + private void OnControlDragging(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag(sender); + mdiControl.Location = new Point(mdiControl.Location.X + e.HorizontalChange, mdiControl.Location.Y + e.VerticalChange); + FitCanvas(); + } + + private T GetSenderTag(object sender) where T : class + { + return (T)((sender as FrameworkElement).Tag); + } + + private void FitCanvas() + { + Canvas canvas = GetCanvas(); + canvas.Width = canvas.Children.OfType().Max(x => Canvas.GetLeft(x) + x.ActualWidth); + canvas.Height = canvas.Children.OfType().Max(x => Canvas.GetTop(x) + x.ActualHeight); + } + + private Canvas GetCanvas() + { + return UIHelper.FindChild(itemsControl, "canvas"); + } + + + private void OnControlMouseDown(object sender, MouseButtonEventArgs e) + { + Canvas.SetZIndex(sender as FrameworkElement, GetCanvas().Children.OfType().Max(x => Canvas.GetZIndex(x) + 1)); + } + + private void OnControlSizeRight(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag(sender); + if (double.IsNaN(mdiControl.View.Width)) mdiControl.View.Width = mdiControl.View.ActualWidth; + if (mdiControl.View.Width + e.HorizontalChange > MIN_SIZE) mdiControl.View.Width += e.HorizontalChange; + } + + private void OnControlSizeBottom(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag(sender); + if (double.IsNaN(mdiControl.View.Height)) mdiControl.View.Height = mdiControl.View.ActualHeight; + if (mdiControl.View.Height + e.VerticalChange > MIN_SIZE) mdiControl.View.Height += e.VerticalChange; + } + + private void OnControlResize(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag(sender); + + if (double.IsNaN(mdiControl.View.Height)) mdiControl.View.Height = mdiControl.View.ActualHeight; + if (double.IsNaN(mdiControl.View.Width)) mdiControl.View.Width = mdiControl.View.ActualWidth; + + if (mdiControl.View.Height + e.VerticalChange > MIN_SIZE) mdiControl.View.Height += e.VerticalChange; + if (mdiControl.View.Width + e.HorizontalChange > MIN_SIZE) mdiControl.View.Width += e.HorizontalChange; + } + + private void OnControlClosed(object sender, RoutedEventArgs e) + { + (ItemsSource as IList).Remove(GetSenderTag(sender)); + } + } +} -- cgit v1.3.1