// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Drawing;

namespace System.Windows.Forms.Design.Behavior;

/// <summary>
///  A Glyph represents a single UI entity managed by an Adorner. A Glyph
///  does not have an HWnd - and is rendered on the BehaviorService's
///  AdornerWindow control. Each Glyph can have a Behavior associated with
///  it - the idea here is that a successfully Hit-Tested Glyph has the
///  opportunity to 'push' a new/different Behavior onto the BehaviorService's
///  BehaviorStack. Note that all Glyphs really do is paint and hit test.
/// </summary>
public abstract class Glyph
{
    private Behavior? _behavior;

    /// <summary>
    ///  Glyph's default constructor takes a Behavior.
    /// </summary>
    protected Glyph(Behavior? behavior)
    {
        _behavior = behavior;
    }

    /// <summary>
    ///  This read-only property will return the Behavior associated with
    ///  this Glyph. The Behavior can be null.
    /// </summary>
    public virtual Behavior? Behavior => _behavior;

    /// <summary>
    ///  This read-only property will return the Bounds associated with
    ///  this Glyph. The Bounds can be empty.
    /// </summary>
    public virtual Rectangle Bounds => Rectangle.Empty;

    /// <summary>
    ///  Abstract method that forces Glyph implementations to provide
    ///  hit test logic. Given any point - if the Glyph has decided to
    ///  be involved with that location, the Glyph will need to return
    ///  a valid Cursor. Otherwise, returning null will cause the
    ///  the BehaviorService to simply ignore it.
    /// </summary>
    public abstract Cursor? GetHitTest(Point p);

    /// <summary>
    ///  Abstract method that forces Glyph implementations to provide
    ///  paint logic. The PaintEventArgs object passed into this method
    ///  contains the Graphics object related to the BehaviorService's
    ///  AdornerWindow.
    /// </summary>
    public abstract void Paint(PaintEventArgs pe);

    /// <summary>
    ///  This method is called by inheriting classes to change the
    ///  Behavior object associated with the Glyph.
    /// </summary>
    protected void SetBehavior(Behavior? behavior)
    {
        _behavior = behavior;
    }
}
