using System;
using System.Drawing;
using Gwen.ControlInternal;
namespace Gwen.Control
{
///
/// Static text label.
///
public class Label : Base
{
private readonly Text m_Text;
private Pos m_Align;
private Padding m_TextPadding;
private bool m_AutoSizeToContents;
///
/// Text alignment.
///
public Pos Alignment { get { return m_Align; } set { m_Align = value; Invalidate(); } }
///
/// Text.
///
public String Text { get { return m_Text.String; } set { SetText(value); } }
///
/// Font.
///
public Font Font
{
get { return m_Text.Font; }
set
{
m_Text.Font = value;
if (m_AutoSizeToContents)
SizeToContents();
Invalidate();
}
}
///
/// Text color.
///
public Color TextColor { get { return m_Text.TextColor; } set { m_Text.TextColor = value; } }
///
/// Override text color (used by tooltips).
///
public Color TextColorOverride { get { return m_Text.TextColorOverride; } set { m_Text.TextColorOverride = value; } }
///
/// Text override - used to display different string.
///
public String TextOverride { get { return m_Text.TextOverride; } set { m_Text.TextOverride = value; } }
///
/// Width of the text (in pixels).
///
public int TextWidth { get { return m_Text.Width; } }
///
/// Height of the text (in pixels).
///
public int TextHeight { get { return m_Text.Height; } }
public int TextX { get { return m_Text.X; } }
public int TextY { get { return m_Text.Y; } }
///
/// Text length (in characters).
///
public int TextLength { get { return m_Text.Length; } }
public int TextRight { get { return m_Text.Right; } }
public virtual void MakeColorNormal() { TextColor = Skin.Colors.Label.Default; }
public virtual void MakeColorBright() { TextColor = Skin.Colors.Label.Bright; }
public virtual void MakeColorDark() { TextColor = Skin.Colors.Label.Dark; }
public virtual void MakeColorHighlight() { TextColor = Skin.Colors.Label.Highlight; }
///
/// Determines if the control should autosize to its text.
///
public bool AutoSizeToContents { get { return m_AutoSizeToContents; } set { m_AutoSizeToContents = value; Invalidate(); InvalidateParent(); } }
///
/// Text padding.
///
public Padding TextPadding { get { return m_TextPadding; } set { m_TextPadding = value; Invalidate(); InvalidateParent(); } }
///
/// Initializes a new instance of the class.
///
/// Parent control.
public Label(Base parent) : base(parent)
{
m_Text = new Text(this);
//m_Text.Font = Skin.DefaultFont;
MouseInputEnabled = false;
SetSize(100, 10);
Alignment = Pos.Left | Pos.Top;
m_AutoSizeToContents = false;
}
///
/// Returns index of the character closest to specified point (in canvas coordinates).
///
///
///
///
protected int GetClosestCharacter(int x, int y)
{
return m_Text.GetClosestCharacter(m_Text.CanvasPosToLocal(new Point(x, y)));
}
///
/// Sets the position of the internal text control.
///
///
///
protected void SetTextPosition(int x, int y)
{
m_Text.SetPosition(x, y);
}
///
/// Handler for text changed event.
///
protected virtual void OnTextChanged()
{}
///
/// Lays out the control's interior according to alignment, padding, dock etc.
///
/// Skin to use.
protected override void Layout(Skin.Base skin)
{
base.Layout(skin);
Pos align = m_Align;
if (m_AutoSizeToContents)
SizeToContents();
int x = m_TextPadding.Left + Padding.Left;
int y = m_TextPadding.Top + Padding.Top;
if (0 != (align & Pos.Right))
x = Width - m_Text.Width - m_TextPadding.Right - Padding.Right;
if (0 != (align & Pos.CenterH))
x = (int)((m_TextPadding.Left + Padding.Left) + ((Width - m_Text.Width - m_TextPadding.Left - Padding.Left - m_TextPadding.Right - Padding.Right) * 0.5f));
if (0 != (align & Pos.CenterV))
y = (int)((m_TextPadding.Top + Padding.Top) + ((Height - m_Text.Height) * 0.5f) - m_TextPadding.Bottom - Padding.Bottom);
if (0 != (align & Pos.Bottom))
y = Height - m_Text.Height - m_TextPadding.Bottom - Padding.Bottom;
m_Text.SetPosition(x, y);
}
///
/// Sets the label text.
///
/// Text to set.
/// Determines whether to invoke "text changed" event.
public virtual void SetText(String str, bool doEvents = true)
{
if (Text == str)
return;
m_Text.String = str;
if (m_AutoSizeToContents)
SizeToContents();
Invalidate();
InvalidateParent();
if (doEvents)
OnTextChanged();
}
public virtual void SizeToContents()
{
m_Text.SetPosition(m_TextPadding.Left + Padding.Left, m_TextPadding.Top + Padding.Top);
m_Text.SizeToContents();
SetSize(m_Text.Width + Padding.Left + Padding.Right + m_TextPadding.Left + m_TextPadding.Right,
m_Text.Height + Padding.Top + Padding.Bottom + m_TextPadding.Top + m_TextPadding.Bottom);
InvalidateParent();
}
///
/// Gets the coordinates of specified character.
///
/// Character index.
/// Character coordinates (local).
public virtual Point GetCharacterPosition(int index)
{
Point p = m_Text.GetCharacterPosition(index);
return new Point(p.X + m_Text.X, p.Y + m_Text.Y);
}
///
/// Renders the control using specified skin.
///
/// Skin to use.
protected override void Render(Skin.Base skin)
{
}
}
}