module Fox
  #
  # The MDI child window contains the application work area in a Multiple Document
  # Interface application.  GUI Controls are connected to the MDI child via delegation
  # through the MDI client, which forwards messages it receives to the active MDI child.
  # The MDI child itself tries to further delegate messages to its single content window,
  # and if not handled there, to its target object.
  # When the MDI child is maximized, it sends a SEL_MAXIMIZE message; when the MDI
  # child is minimized, it sends a SEL_MINIMIZE message.  When it is restored, it
  # sends a SEL_RESTORE message to its target.
  # The MDI child also notifies its target when it becomes the active MDI child, via the
  # SEL_SELECTED message.  The void* in the SEL_SELECTED message refers to the previously
  # active MDI child, if any.
  # When an MDI child ceases to be the active window, a SEL_DESELECTED message
  # is sent to its target, and the void* in the SEL_DESELECTED message refers to the newly
  # activated MDI child, if any.
  # Thus, interception of SEL_SELECTED and SEL_DESELECTED allows the target object to determine
  # whether the user switched between MDI windows of the same document (target) or merely between
  # two MDI windows belonging to the same document.
  # When the MDI child is closed, it first sends a SEL_DESELECTED to its target to
  # notify it that it is no longer the active window; next, it sends a SEL_CLOSE message
  # to its target to allow the target to clean up (for example, destroy the document
  # if this was the last window of the document).
  # The target can prevent the MDI child window from being closed by returning 1 from
  # the SEL_CLOSE message handler (objection).  If the target returns 0 or does not
  # handle the SEL_CLOSE message, the MDI child will be closed.
  # If the MDI child windows was not closed, the child window will be reselected
  # as the currently active MDI child widget, and a SEL_SELECTED will be sent to
  # its target to notify it of this fact.
  # The SEL_UPDATE message can be used to modify the MDI child's title (via
  # ID_SETSTRINGVALUE), and window icon (via ID_SETICONVALUE).
  #
  # === Events
  #
  # The following messages are sent by FXMDIChild to its target:
  #
  # +SEL_LEFTBUTTONPRESS+::	sent when the left mouse button goes down; the message data is an FXEvent instance.
  # +SEL_LEFTBUTTONRELEASE+::	sent when the left mouse button goes up; the message data is an FXEvent instance.
  # +SEL_MIDDLEBUTTONPRESS+::	sent when the middle mouse button goes down; the message data is an FXEvent instance.
  # +SEL_MIDDLEBUTTONRELEASE+::	sent when the middle mouse button goes up; the message data is an FXEvent instance.
  # +SEL_RIGHTBUTTONPRESS+::	sent when the right mouse button goes down; the message data is an FXEvent instance.
  # +SEL_RIGHTBUTTONRELEASE+::	sent when the right mouse button goes up; the message data is an FXEvent instance.
  # +SEL_SELECTED+::
  #   sent when the window is selected; the message data is a reference to the MDI client's previous active
  #   child window, or +nil+ if there was no active child window.
  # +SEL_DESELECTED+::
  #   sent when the window is deselected; the message data is a reference to the MDI client's new active child window,
  #   or +nil+ if there is no active child window.
  # +SEL_MAXIMIZE+::		sent when the window is maximized
  # +SEL_MINIMIZE+::		sent when the window is minimized
  # +SEL_RESTORE+::		sent when the window is restored to its normal size and position
  # +SEL_CLOSE+::
  #   sent when the user is trying to close this window. The message handler for this message should
  #   return 1 (or true) if the target objects to closing the window; otherwise it should just return false (or zero).
  # +SEL_DELETE+::		sent immediately before this window is destroyed
  #
  # === MDI Child Window styles
  #
  # +MDI_NORMAL+::	Normal display mode
  # +MDI_MAXIMIZED+::	Window appears maximized
  # +MDI_MINIMIZED+::	Window is iconified or minimized
  # +MDI_TRACKING+::	Track continuously during dragging
  #
  class FXMDIChild < FXComposite

    # Normal (restored) position x-coordinate [Integer]
    attr_accessor :normalX

    # Normal (restored) position y-coordinate [Integer]
    attr_accessor :normalY

    # Normal (restored) width [Integer]
    attr_accessor :normalWidth

    # Normal (restored) height [Integer]
    attr_accessor :normalHeight

    # Iconified position x-coordinate [Integer]
    attr_accessor :iconX

    # Iconified position y-coordinate [Integer]
    attr_accessor :iconY

    # Iconified width [Integer]
    attr_accessor :iconWidth

    # Iconified height [Integer]
    attr_accessor :iconHeight
    
    # Content window [FXWindow]
    attr_reader :contentWindow
    
    # Window title [String]
    attr_accessor :title

    # Highlight color [FXColor]
    attr_accessor :hiliteColor

    # Shadow color [FXColor]
    attr_accessor :shadowColor

    # Base color [FXColor]
    attr_accessor :baseColor

    # Border color [FXColor]
    attr_accessor :borderColor

    # Title color [FXColor]
    attr_accessor :titleColor

    # Title background color [FXColor]
    attr_accessor :titleBackColor
    
    # Window icon [FXIcon]
    attr_accessor :icon
    
    # Window menu [FXPopup]
    attr_accessor :menu
    
    # Title font [FXFont]
    attr_accessor :font

    # Construct MDI Child window with given name and icon
    def initialize(p, name, ic=nil, pup=nil, opts=0, x=0, y=0, width=0, height=0) # :yields: theMDIChild
    end
  
    #
    # Minimize this window.
    # If _notify_ is +true+, ...
    #
    def minimize(notify=false); end

    #
    # Maximize this window.
    # If _notify_ is +true+, ...
    #
    def maximize(notify=false); end

    #
    # Restore this window to its normal position and size.
    # If _notify_ is +true+, ...
    #
    def restore(notify=false); end

    # Return +true+ if maximized
    def maximized? ; end
    
    # Return +true+ if minimized
    def minimized? ; end
    
    # Set tracking instead of just outline
    def setTracking(tracking); end
    
    alias tracking= setTracking
    
    # Return +true+ if tracking, +false+ otherwise.
    def getTracking(); end
    
    alias isTracking? getTracking
    alias tracking    getTracking

  end
end
