using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace UI { public interface Container { Layout Layout { get; set; } void Add(UIElement control, bool fill); } public class Layout { public bool? Fill { get; set; } public bool Hexpand { get; set; } public bool Vexpand { get; set; } public bool NewLine { get; set; } public int GridWidth { get; set; } public String Label { get; set; } public Layout() { Reset(); } public bool IsFill(bool fill) { if (Fill != null) { return (bool)Fill; } return fill; } public void Reset() { Fill = null; Hexpand = false; Vexpand = false; NewLine = false; GridWidth = 1; Label = null; } } public enum BoxOrientation { VERTICAL, HORIZONTAL } public class BoxContainer : Grid, Container { public Layout Layout { get; set; } private BoxOrientation Orientation; private int Spacing; private int x = 0; private int y = 0; private bool filled = false; public BoxContainer(BoxOrientation orientation, int margin, int spacing) : base() { Layout = new Layout(); Margin = new Thickness(margin); Spacing = spacing; Orientation = orientation; if(Orientation == BoxOrientation.HORIZONTAL) { RowDefinition row = new RowDefinition(); row.Height = new GridLength(1, GridUnitType.Star); RowDefinitions.Add(row); } else { ColumnDefinition col = new ColumnDefinition(); col.Width = new GridLength(1, GridUnitType.Star); ColumnDefinitions.Add(col); } } public BoxContainer(Container parent, BoxOrientation orientation, int margin, int spacing) : this(orientation, margin, spacing) { parent.Add(this, true); } public void Add(UIElement control, bool fill) { fill = Layout.IsFill(fill); if(Orientation == BoxOrientation.HORIZONTAL) { if(Spacing > 0) { ColumnDefinition spaceCol = new ColumnDefinition(); spaceCol.Width = new GridLength(Spacing, GridUnitType.Pixel); ColumnDefinitions.Add(spaceCol); x++; } ColumnDefinition col = new ColumnDefinition(); if(filled && fill) { fill = false; Console.WriteLine("BoxContainer can only contain one filled control"); } if(fill) { col.Width = new GridLength(1, GridUnitType.Star); filled = true; } else { col.Width = GridLength.Auto; } ColumnDefinitions.Add(col); } else { if (Spacing > 0) { RowDefinition spaceRow = new RowDefinition(); spaceRow.Height = new GridLength(Spacing, GridUnitType.Pixel); RowDefinitions.Add(spaceRow); y++; } RowDefinition row = new RowDefinition(); if (filled && fill) { fill = false; Console.WriteLine("BoxContainer can only contain one filled control"); } if(fill) { row.Height = new GridLength(1, GridUnitType.Star); filled = true; } else { row.Height = GridLength.Auto; } RowDefinitions.Add(row); } Grid.SetColumn(control, x); Grid.SetRow(control, y); Children.Add(control); if(Orientation == BoxOrientation.HORIZONTAL) { x++; } else { y++; } Layout.Reset(); } } public class GridContainer : Grid, Container { public Layout Layout { get; set; } private int X = 0; private int Y = 0; private int CurrentWidth = 0; private int CurrentHeight = 0; private int ColSpacing; private int RowSpacing; public GridContainer(Container parent, int margin, int colspacing, int rowspacing) : base() { Layout = new Layout(); Margin = new Thickness(margin); ColSpacing = colspacing; RowSpacing = rowspacing; parent.Add(this, true); } public void Add(UIElement control, bool fill) { if(Layout.NewLine) { X = 0; Y++; } ColumnDefinition col; RowDefinition row; bool getcol = false; if(X >= CurrentWidth) { if (ColSpacing > 0 && X != 0) { ColumnDefinition spaceCol = new ColumnDefinition(); spaceCol.Width = new GridLength(ColSpacing, GridUnitType.Pixel); ColumnDefinitions.Add(spaceCol); X++; } col = new ColumnDefinition(); col.Width = GridLength.Auto; ColumnDefinitions.Add(col); CurrentWidth = X + 1; } else { if (ColSpacing > 0 && X % 2 > 0) { X++; } col = ColumnDefinitions.ElementAt(X); } if(getcol) { col = ColumnDefinitions.ElementAt(X); } if (Y >= CurrentHeight) { if (RowSpacing > 0 && Y != 0) { RowDefinition spaceRow = new RowDefinition(); spaceRow.Height = new GridLength(RowSpacing, GridUnitType.Pixel); RowDefinitions.Add(spaceRow); Y++; } row = new RowDefinition(); row.Height = GridLength.Auto; RowDefinitions.Add(row); CurrentHeight = Y + 1; } else { row = RowDefinitions.ElementAt(Y); } if(Layout.Hexpand) { col.Width = new GridLength(1, GridUnitType.Star); } if(Layout.Vexpand) { row.Height = new GridLength(1, GridUnitType.Star); } int gridwidth = Layout.GridWidth; if(gridwidth > 1) { gridwidth++; } Grid.SetColumn(control, X); Grid.SetRow(control, Y); Grid.SetColumnSpan(control, gridwidth); Children.Add(control); Layout.Reset(); X += gridwidth; } } public class ScrollViewerContainer : ScrollViewer, Container { public Layout Layout { get; set; } public ScrollViewerContainer(Container parent) : base() { Layout = new Layout(); HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; VerticalScrollBarVisibility = ScrollBarVisibility.Auto; parent.Add(this, true); } public void Add(UIElement control, bool fill) { Content = control; } } public class TabViewContainer : TabControl, Container { public Layout Layout { get; set; } public TabViewContainer(Container parent) : base() { Layout = new Layout(); parent.Add(this, true); } public void Add(UIElement control, bool fill) { TabItem tab = new TabItem(); tab.Header = Layout.Label != null ? Layout.Label : "New Tab"; Items.Add(tab); tab.Content = control; Layout.Reset(); } } }