using System;
using System.Collections;
using System.Text.Json.Serialization;
using NStack;
using Terminal.Gui;
using static Terminal.Gui.ConfigurationManager;
namespace Terminal.Gui {
///
/// A that draws a border around its with a Title at the top.
///
///
/// The 'client area' of a is a rectangle deflated by one or more rows/columns from . A this time there is no
/// API to determine this rectangle.
///
public class Window : Toplevel {
///
/// Initializes a new instance of the class with an optional title using positioning.
///
/// Superview-relative rectangle specifying the location and size
/// Title
///
/// This constructor initializes a Window with a of . Use constructors
/// that do not take Rect parameters to initialize a Window with .
///
public Window (Rect frame, ustring title = null) : this (frame, title, padding: 0, border: null)
{
}
///
/// Initializes a new instance of the class with an optional title using positioning.
///
/// Title.
///
/// This constructor initializes a View with a of .
/// Use , , , and properties to dynamically control the size and location of the view.
///
public Window (ustring title = null) : this (title, padding: 0, border: null)
{
}
///
/// Initializes a new instance of the class using positioning.
///
public Window () : this (title: null) { }
///
/// Initializes a new instance of the using positioning with the specified frame for its location, with the specified frame padding,
/// and an optional title.
///
/// Superview-relative rectangle specifying the location and size
/// Title
/// Number of characters to use for padding of the drawn frame.
/// The .
///
/// This constructor initializes a Window with a of . Use constructors
/// that do not take Rect parameters to initialize a Window with of
///
public Window (Rect frame, ustring title = null, int padding = 0, Border border = null) : base (frame)
{
SetInitialProperties (title, frame, padding, border);
}
///
/// Initializes a new instance of the using positioning,
/// and an optional title.
///
/// Title.
/// Number of characters to use for padding of the drawn frame.
/// The .
///
/// This constructor initializes a View with a of .
/// Use , , , and properties to dynamically control the size and location of the view.
///
public Window (ustring title = null, int padding = 0, Border border = null) : base ()
{
SetInitialProperties (title, Rect.Empty, padding, border);
}
///
/// The default for . The default is .
///
///
/// This property can be set in a Theme to change the default for all s.
///
///[SerializableConfigurationProperty (Scope = typeof (ThemeScope)), JsonConverter (typeof (JsonStringEnumConverter))]
public static BorderStyle DefaultBorderStyle { get; set; } = BorderStyle.Single;
void SetInitialProperties (ustring title, Rect frame, int padding = 0, Border border = null)
{
CanFocus = true;
ColorScheme = Colors.Base;
if (title == null) title = ustring.Empty;
Title = title;
if (border == null) {
// TODO: v2 this is a hack until Border gets refactored
Border = new Border () {
BorderStyle = DefaultBorderStyle,
PaddingThickness = new Thickness (padding),
};
} else {
Border = border;
}
BorderFrame.Thickness = new Thickness (1);
BorderFrame.BorderStyle = Border.BorderStyle;
//BorderFrame.ColorScheme = ColorScheme;
BorderFrame.Data = "BorderFrame";
// TODO: Hack until Border is refactored
Padding.Thickness = Border.PaddingThickness ?? Padding.Thickness;
if (frame.IsEmpty) {
// Make it bigger to fit the margin, border, & padding
frame = new Rect (frame.Location, new Size (Margin.Thickness.Horizontal + BorderFrame.Thickness.Horizontal + Padding.Thickness.Horizontal + 1, Margin.Thickness.Vertical + BorderFrame.Thickness.Vertical + Padding.Thickness.Vertical + 1));
}
}
/////
///// Enumerates the various s in the embedded .
/////
///// The enumerator.
//public new IEnumerator GetEnumerator ()
//{
// return contentView.GetEnumerator ();
//}
///
public override void Add (View view)
{
base.Add (view);
if (view.CanFocus) {
CanFocus = true;
}
AddMenuStatusBar (view);
}
///
public override void Remove (View view)
{
if (view == null) {
return;
}
SetNeedsDisplay ();
base.Remove (view);
RemoveMenuStatusBar (view);
}
}
}