module Fox
  #
  # Base class for all windows
  #
  # === Events
  #
  # The following messages are sent by FXWindow to its target:
  #
  # +SEL_MAP+::   sent when the window is mapped to the screen; the message data is an FXEvent instance.
  # +SEL_UNMAP+::  sent when the window is unmapped; the message data is an FXEvent instance.
  # +SEL_CONFIGURE+::  sent when the window's size changes; the message data is an FXEvent instance.
  # +SEL_ENTER+::  sent when the mouse cursor enters this window
  # +SEL_LEAVE+::  sent when the mouse cursor leaves this window
  # +SEL_FOCUSIN+::  sent when this window gains the focus
  # +SEL_FOCUSOUT+::  sent when this window loses the focus
  # +SEL_UPDATE+::  sent when this window needs an update
  # +SEL_UNGRABBED+::  sent when this window loses the mouse grab (or capture)
  #
  # For each of the following keyboard-related events, the message data is an FXEvent instance:
  #
  # +SEL_KEYPRESS+::  sent when a key is pressed
  # +SEL_KEYRELEASE+::  sent when a key is released
  #
  # For each of the following mouse-related events, the message data is an FXEvent instance:
  #
  # +SEL_MOTION+::  sent when the mouse moves
  # +SEL_LEFTBUTTONPRESS+:: sent when the left mouse button goes down
  # +SEL_LEFTBUTTONRELEASE+:: sent when the left mouse button goes up
  # +SEL_MIDDLEBUTTONPRESS+:: sent when the middle mouse button goes down
  # +SEL_MIDDLEBUTTONRELEASE+:: sent when the middle mouse button goes up
  # +SEL_RIGHTBUTTONPRESS+:: sent when the right mouse button goes down
  # +SEL_RIGHTBUTTONRELEASE+:: sent when the right mouse button goes up
  # +SEL_MOUSEWHEEL+::  sent when the mouse wheel is scrolled
  #
  # For each of the following selection-related events, the message data is an FXEvent instance:
  #
  # +SEL_SELECTION_GAINED+:: sent when this window acquires the selection
  # +SEL_SELECTION_LOST+:: sent when this window loses the selection
  # +SEL_SELECTION_REQUEST+:: sent when this window's selection is requested
  #
  # For each of the following clipboard-related events, the message data is an FXEvent instance:
  #
  # +SEL_CLIPBOARD_GAINED+:: sent when this window acquires the clipboard
  # +SEL_CLIPBOARD_LOST+:: sent when this window loses the clipboard
  # +SEL_CLIPBOARD_REQUEST+:: sent when this window's clipboard data is requested
  #
  # For each of the following drag-and-drop events, the message data is an FXEvent instance:
  #
  # +SEL_BEGINDRAG+::  sent at the beginning of a drag operation
  # +SEL_DRAGGED+::  sent while stuff is being dragged around
  # +SEL_ENDDRAG+::  sent at the end of a drag operation
  # +SEL_DND_ENTER+::  drag-and-drop enter
  # +SEL_DND_LEAVE+::  drag-and-drop leave
  # +SEL_DND_MOTION+::  drag-and-drop motion
  # +SEL_DND_DROP+::  drag-and-drop motion
  # +SEL_DND_REQUEST+::  drag-and-drop request
  #
  # === Layout hints for child widgets
  #
  # +LAYOUT_NORMAL+::       Default layout mode
  # +LAYOUT_SIDE_TOP+::     Pack on top side (default)
  # +LAYOUT_SIDE_BOTTOM+::  Pack on bottom side
  # +LAYOUT_SIDE_LEFT+::    Pack on left side
  # +LAYOUT_SIDE_RIGHT+::   Pack on right side
  # +LAYOUT_FILL_COLUMN+::  Matrix column is stretchable
  # +LAYOUT_FILL_ROW+::     Matrix row is stretchable
  # +LAYOUT_LEFT+::         Stick on left (default)
  # +LAYOUT_RIGHT+::        Stick on right
  # +LAYOUT_CENTER_X+::     Center horizontally
  # +LAYOUT_FIX_X+::        X fixed
  # +LAYOUT_TOP+::          Stick on top (default)
  # +LAYOUT_BOTTOM+::       Stick on bottom
  # +LAYOUT_CENTER_Y+::     Center vertically
  # +LAYOUT_FIX_Y+::        Y fixed
  # +LAYOUT_FIX_WIDTH+::    Width fixed
  # +LAYOUT_FIX_HEIGHT+::   Height fixed
  # +LAYOUT_MIN_WIDTH+::    Minimum width is the default
  # +LAYOUT_MIN_HEIGHT+::   Minimum height is the default
  # +LAYOUT_FILL_X+::       Stretch or shrink horizontally
  # +LAYOUT_FILL_Y+::       Stretch or shrink vertically
  # +LAYOUT_FILL::          Stretch or shrink in both directions
  # +LAYOUT_EXPLICIT+::     Explicit placement
  # +LAYOUT_DOCK_SAME+::    Dock on same galley, if it fits
  # +LAYOUT_DOCK_NEXT+::    Dock on next galley
  #
  # === Frame border appearance styles (for subclasses)
  #
  # +FRAME_NONE+::          Default is no frame
  # +FRAME_SUNKEN+::        Sunken border
  # +FRAME_RAISED+::        Raised border
  # +FRAME_THICK+::         Thick border
  # +FRAME_GROOVE+::        A groove or etched-in border
  # +FRAME_RIDGE+::         A ridge or embossed border
  # +FRAME_LINE+::          Simple line border
  # +FRAME_NORMAL+::        Regular raised/thick border
  #
  # === Packing style (for packers)
  #
  # +PACK_NORMAL+::         Default is each its own size
  # +PACK_UNIFORM_HEIGHT+:: Uniform height
  # +PACK_UNIFORM_WIDTH+::  Uniform width
  #
  # === Message IDs common to most windows
  #
  # +ID_NONE+::                 x
  # +ID_HIDE+::                 x
  # +ID_SHOW+::                 x
  # +ID_TOGGLESHOWN+::          x
  # +ID_LOWER+::                x
  # +ID_RAISE+::                x
  # +ID_DELETE+::               x
  # +ID_DISABLE+::              x
  # +ID_ENABLE+::               x
  # +ID_TOGGLEENABLED+::        x
  # +ID_UNCHECK+::              x
  # +ID_CHECK+::                x
  # +ID_UNKNOWN+::              x
  # +ID_UPDATE+::               x
  # +ID_AUTOSCROLL+::           x
  # +ID_HSCROLLED+::            x
  # +ID_VSCROLLED+::            x
  # +ID_SETVALUE+::             x
  # +ID_SETINTVALUE+::          x
  # +ID_SETREALVALUE+::         x
  # +ID_SETSTRINGVALUE+::       x
  # +ID_SETINTRANGE+::          x
  # +ID_SETREALRANGE+::         x
  # +ID_GETINTVALUE+::          x
  # +ID_GETREALVALUE+::         x
  # +ID_GETSTRINGVALUE+::       x
  # +ID_GETINTRANGE+::          x
  # +ID_GETREALRANGE+::         x
  # +ID_QUERY_MENU+::           x
  # +ID_HOTKEY+::               x
  # +ID_ACCEL+::                x
  # +ID_UNPOST+::               x
  # +ID_POST+::                 x
  # +ID_MDI_TILEHORIZONTAL+::   x
  # +ID_MDI_TILEVERTICAL+::     x
  # +ID_MDI_CASCADE+::          x
  # +ID_MDI_MAXIMIZE+::         x
  # +ID_MDI_MINIMIZE+::         x
  # +ID_MDI_RESTORE+::          x
  # +ID_MDI_CLOSE+::            x
  # +ID_MDI_WINDOW+::           x
  # +ID_MDI_MENUWINDOW+::       x
  # +ID_MDI_MENUMINIMIZE+::     x
  # +ID_MDI_MENURESTORE+::      x
  # +ID_MDI_MENUCLOSE+::        x
  # +ID_MDI_NEXT+::             x
  # +ID_MDI_PREV+::             x

  class FXWindow < FXDrawable

    # This window's parent window {FXWindow}
    attr_reader :parent

    # This window's owner window {FXWindow}
    attr_reader  :owner

    # The shell window for this window {FXWindow}
    attr_reader  :shell

    # Root window {FXWindow}
    attr_reader  :root

    # Next (sibling) window, if any {FXWindow}
    attr_reader  :next

    # Previous (sibling) window, if any {FXWindow}
    attr_reader  :prev

    # This window's first child window, if any {FXWindow}
    attr_reader  :first

    # This window's last child window, if any {FXWindow}
    attr_reader  :last

    # Currently focused child window, if any {FXWindow}
    attr_reader  :focus

    # Window key [Integer]
    attr_accessor :key

    # Message target object for this window {FXObject}
    attr_accessor :target

    # Message identifier for this window [Integer]
    attr_accessor :selector

    # This window's x-coordinate, in the parent's coordinate system [Integer]
    attr_accessor :x

    # This window's y-coordinate, in the parent's coordinate system [Integer]
    attr_accessor :y

    # The accelerator table for this window {FXAccelTable}
    attr_accessor :accelTable

    # Layout hints for this window [Integer]
    attr_accessor :layoutHints

    # Number of child windows for this window [Integer]
    attr_reader  :numChildren

    # Default cursor for this window {FXCursor}
    attr_accessor :defaultCursor

    # Drag cursor for this window {FXCursor}
    attr_accessor :dragCursor

    # Window background color {FXColor}
    attr_accessor :backColor

    # Common DND type: Raw octet stream
    def FXWindow.octetType; end

    # Common DND type: Delete request
    def FXWindow.deleteType; end

    # Common DND type: ASCII text request
    def FXWindow.textType; end

    # Common DND type: UTF-8 text request
    def FXWindow.utf8Type; end

    # Common DND type: UTF-16 text request
    def FXWindow.utf16Type; end

    # Common DND type: Color
    def FXWindow.colorType; end

    # Common DND type: URI List
    def FXWindow.urilistType; end

    # Common DND type: Clipboard text type (pre-registered)
    def FXWindow.stringType; end

    # Common DND type: Clipboard image type (pre-registered)
    def FXWindow.imageType; end

    # Common DND type name: Raw octet stream
    def FXWindow.octetTypeName() ; end

    # Common DND type name: Delete request
    def FXWindow.deleteTypeName() ; end

    # Common DND type name: ASCII text
    def FXWindow.textTypeName() ; end

    # Common DND type name: Color
    def FXWindow.colorTypeName() ; end

    # Common DND type name: URI List
    def FXWindow.urilistTypeName() ; end

    # Common DND type name: UTF-8 text request
    def FXWindow.utf8TypeName() ; end

    # Common DND type name: UTF-16 text request
    def FXWindow.utf16TypeName() ; end

    #
    # Return an initialized FXWindow instance, for a child window.
    #
    # ==== Parameters:
    #
    # +p+:: the parent window for this window {FXComposite}
    # +opts+:: window options [Integer]
    # +x+:: initial x-position [Integer]
    # +y+:: initial y-position [Integer]
    # +width+:: initial width [Integer]
    # +height+:: initial height [Integer]
    #
    def initialize(p, opts=0, x=0, y=0, width=0, height=0) # :yields: theWindow
    end

    #
    # Return an initialized FXWindow instance, for a shell window.
    #
    # ==== Parameters:
    #
    # +a+:: an application instance {FXApp}
    # +vis+:: the visual to use for this window {FXVisual}
    #
    def initialize(a, vis) # :yields: theWindow
    end

    #
    # Return an initialized FXWindow instance, for an owned window.
    #
    # ==== Parameters:
    #
    # +a+:: an application instance {FXApp}
    # +own+:: the owner window for this window {FXWindow}
    # +opts+:: window options [Integer]
    # +x+:: initial x-position [Integer]
    # +y+:: initial y-position [Integer]
    # +width+:: initial width [Integer]
    # +height+:: initial height [Integer]
    #
    def initialize(a, own, opts, x, y, w, h) # :yields: theWindow
    end

    # Return the window width (in pixels).
    def width; end

    #
    # Set the window width; and flag the widget as being in need of
    # layout by its parent.  This does not immediately update the server-
    # side representation of the widget.
    #
    def width=(w); end

    # Return the window height (in pixels).
    def height; end

    #
    # Set the window height; and flag the widget as being in need of
    # layout by its parent.  This does not immediately update the server-
    # side representation of the widget.
    #
    def height=(h); end

    # Return the default width of this window
    def defaultWidth(); end

    # Return the default height of this window
    def defaultHeight(); end

    # Return width for given height
    def getWidthForHeight(givenHeight); end

    # Return height for given width
    def getHeightForWidth(givenWidth); end

    #
    # Add this hot key to the closest ancestor's accelerator table.
    #
    def addHotKey(code)
      accel = nil
      win = self
      while win && (accel = win.accelTable).nil?
        win = win.parent
      end
      if accel
        accel.addAccel(code, self, MKUINT(ID_HOTKEY, SEL_KEYPRESS), MKUINT(ID_HOTKEY, SEL_KEYRELEASE))
      end
    end

    #
    # Remove this hot key from the closest ancestor's accelerator
    # table.
    #
    def remHotKey(code)
      accel = nil
      win = self
      while win && (accel = win.accelTable).nil?
        win = win.parent
      end
      if accel
        accel.removeAccel(code)
      end
    end

    # Return +true+ if this window is a shell window.
    def shell?() ; end

    #
    # Return +true+ if specified _window_ is ancestor of this window.
    #
    def childOf?(window) ; end

    #
    # Return +true+ if this window contains _child_ in its subtree.
    #
    def containsChild?(child) ; end

    # Return the child window at specified coordinates (_x_, _y_)
    def getChildAt(x, y) ; end

    # Return the index (starting from zero) of the specified child _window_,
    # or -1 if the window is not a child of this window.
    def indexOfChild(window) ; end

    # Remove specified child window
    def removeChild(child) ; end

    # Return the child window at specified index. Raises IndexError if _index_ is out of range.
    def childAtIndex(index) ; end

    # Return the common ancestor of window _a_ and window _b_.
    def FXWindow.commonAncestor(a, b); end

    # Return +true+ if sibling _a_ comes before sibling _b_.
    def FXWindow.before?(a, b); end

    # Return +true+ if sibling _a_ comes after sibling _b_.
    def FXWindow.after?(a, b); end

    # Return compose context (an FXComposeContext).
    def composeContext; end

    # Create compose context.
    def createComposeContext; end

    # Destroy compose context.
    def destroyComposeContext; end

    # Return the cursor position and mouse button-state as a three-element array.
    def cursorPosition() ; end

    # Warp the cursor to the new position (_x_, _y_).
    def setCursorPosition(x, y); end

    # Return +true+ if this window is able to receive mouse and keyboard events.
    def enabled?() ; end

    # Return +true+ if this window is active.
    def active?() ; end

    # Return +true+ if this window is a control capable of receiving the focus.
    def canFocus?() ; end

    # Return +true+ if this window has the focus.
    def hasFocus?() ; end

    # Return +true+ if this window is in the focus chain.
    def inFocusChain? ; end

    # Move the focus to this window.
    def setFocus(); end

    # Remove the focus from this window.
    def killFocus(); end

    # Notification that focus moved to a new child window.
    def changeFocus(child); end

    # This changes the default window which responds to the *Enter*
    # key in a dialog. If _enable_ is +true+, this window becomes the default
    # window; when _enable_ is +false+, this window will no longer be the
    # default window.  Finally, when _enable_ is +MAYBE+, the default window
    # will revert to the initial default window.
    def setDefault(enable=TRUE) ; end

    # Return +true+ if this is the default window.
    def default?() ; end

    # Make this window the initial default window.
    def setInitial(enable=true) ; end

    # Return +true+ if this is the initial default window.
    def initial?() ; end

    # Enable the window to receive mouse and keyboard events.
    def enable(); end

    # Disable the window from receiving mouse and keyboard events.
    def disable(); end

    # Create all of the server-side resources for this window.
    def create(); end

    # Detach the server-side resources for this window.
    def detach(); end

    # Destroy the server-side resources for this window.
    def destroy(); end

    #
    # Set window shape, where _shape_ is either an FXRegion, FXBitmap or
    # FXIcon instance.
    #
    def setShape(shape); end

    # Clear window shape
    def clearShape(); end

    # Raise this window to the top of the stacking order.
    def raiseWindow(); end

    # Lower this window to the bottom of the stacking order.
    def lower(); end

    #
    # Move the window immediately, in the parent's coordinate system.
    # Update the server representation as well if the window is realized.
    # Perform layout of the children when necessary.
    #
    def move(x, y) ; end

    #
    # Resize the window to the specified width and height immediately,
    # updating the server representation as well, if the window was realized.
    # Perform layout of the children when necessary.
    #
    def resize(w, h) ; end

    #
    # Move and resize the window immediately, in the parent's coordinate system.
    # Update the server representation as well if the window is realized.
    # Perform layout of the children when necessary.
    #
    def position(x, y, w, h); end

    # Mark this window's layout as dirty
    def recalc(); end

    # Perform layout immediately.
    def layout(); end

    # Generate a SEL_UPDATE message for the window and its children.
    def forceRefresh(); end

    # Reparent this window under new _father_ window, before _other_ sibling..
    def reparent(father, other); end

    # Scroll rectangle (_x_, _y_, _w_, _h_) by a shift of (_dx_, _dy_)
    def scroll(x, y, w, h, dx, dy); end

    # Mark the entire window client area dirty.
    def update() ; end

    # Mark the specified rectangle dirty
    def update(x, y, w, h) ; end

    # Process any outstanding repaint messages immediately, for the given rectangle
    def repaint(x, y, w, h) ; end

    # If marked but not yet painted, paint the entire window
    def repaint() ; end

    # Grab the mouse to this window; future mouse events will be
    # reported to this window even while the cursor goes outside of this window
    def grab() ; end

    # Release the mouse grab
    def ungrab(); end

    # Return +true+ if the window has been grabbed
    def grabbed?() ; end

    # Grab keyboard device
    def grabKeyboard(); end

    # Ungrab keyboard device
    def ungrabKeyboard(); end

    # Return +true+ if active grab is in effect
    def grabbedKeyboard?() ; end

    # Show this window
    def show(); end

    # Hide this window
    def hide(); end

    # Return +true+ if this window is shown.
    def shown?() ; end

    alias visible? shown?

    # Return +true+ if this window is a composite.
    def composite?() ; end

    # Return +true+ if this window is under the cursor
    def underCursor?() ; end

    # Return +true+ if this window owns the primary selection
    def hasSelection?() ; end

    #
    # Try to acquire the primary selection, given an array of drag types.
    # Returns +true+ on success.
    #
    def acquireSelection(typesArray) ; end

    #
    # Release the primary selection. Returns +true+ on success.
    #
    def releaseSelection(); end

    # Return +true+ if this window owns the clipboard
    def hasClipboard?() ; end

    #
    # Try to acquire the clipboard, given an array of drag types.
    # Returns +true+ on success.
    #
    def acquireClipboard(typesArray) ; end

    #
    # Release the clipboard. Returns +true+ on success.
    #
    def releaseClipboard(); end

    # Enable this window to receive drops
    def dropEnable(); end

    # Disable this window from receiving drops
    def dropDisable(); end

    # Return +true+ if this window is able to receive drops
    def dropEnabled?() ; end

    # Return +true+ if a drag operation has been initiated from this window
    def dragging?() ; end

    # Initiate a drag operation with an array of previously registered drag types
    def beginDrag(typesArray) ; end

    # When dragging, inform the drop target of the new position and
    # the drag action. The _action_ is a constant, one of:
    #
    # +DRAG_REJECT+:: reject all drop actions
    # +DRAG_ACCEPT+:: accept any drop action
    # +DRAG_COPY+:: accept this drop as a copy
    # +DRAG_MOVE+:: accept this drop as a move
    # +DRAG_LINK+:: accept this drop as a link
    # +DRAG_PRIVATE+:: private

    def handleDrag(x, y, action=DRAG_COPY) ; end

    #
    # Terminate the drag operation with or without actually dropping the data.
    # Return the action performed by the target.
    #
    def endDrag(drop=true); end

    # Return +true+ if this window is the target of a drop
    def dropTarget?() ; end

    # When being dragged over, indicate that no further +SEL_DND_MOTION+ messages
    # are required while the cursor is inside the given rectangle
    def setDragRectangle(x, y, w, h, wantUpdates=true); end

    # When being dragged over, indicate we want to receive +SEL_DND_MOTION+ messages
    # every time the cursor moves
    def clearDragRectangle(); end

    # When being dragged over, indicate acceptance or rejection of the dragged data.
    # The _action_ is a constant indicating the suggested drag action, one of:
    #
    # +DRAG_REJECT+:: reject all drop actions
    # +DRAG_ACCEPT+:: accept any drop action
    # +DRAG_COPY+:: accept this drop as a copy
    # +DRAG_MOVE+:: accept this drop as a move
    # +DRAG_LINK+:: accept this drop as a link
    # +DRAG_PRIVATE+:: private

    def acceptDrop(action=DRAG_ACCEPT); end

    # Returns +DRAG_REJECT+ when the drop target would not accept the drop;
    # otherwise indicates acceptance by returning one of +DRAG_ACCEPT+,
    # +DRAG_COPY+, +DRAG_MOVE+ or +DRAG_LINK+.
    def didAccept() ; end

    #
    # Sent by the drop target in response to +SEL_DND_DROP+.  The drag action
    # should be the same as the action the drop target reported to the drag
    # source in reponse to the +SEL_DND_MOTION+ message.
    # This function notifies the drag source that its part of the drop transaction
    # is finished, and that it is free to release any resources involved in the
    # drag operation.
    # Calling {#dropFinished} is advisable in cases where the drop target needs
    # to perform complex processing on the data received from the drag source,
    # prior to returning from the +SEL_DND_DROP+ message handler.
    #
    def dropFinished(action=DRAG_REJECT); end

    # When being dragged over, inquire the drag types being offered.
    # The _origin_ is a constant indicating the origin of the data, one of
    # +FROM_SELECTION+, +FROM_CLIPBOARD+ or +FROM_DRAGNDROP+.
    # Returns an array of drag types.
    def inquireDNDTypes(origin) ; end

    # When being dragged over, return +true+ if we are offered the given drag type.
    # The _origin_ is a constant indicating the origin of the data, one of
    # +FROM_SELECTION+, +FROM_CLIPBOARD+ or +FROM_DRAGNDROP+.
    # The _type_ is a previously registered drag type.
    def offeredDNDType?(origin, type) ; end

    # When being dragged over, return the drag action
    def inquireDNDAction() ; end

    # Get DND data; the caller becomes the owner of the array.
    # The _origin_ is a constant indicating the origin of the data, one of
    # +FROM_SELECTION+, +FROM_CLIPBOARD+ or +FROM_DRAGNDROP+.
    # The _type_ is a previously registered drag type.
    def getDNDData(origin, type) ; end

    # Set DND data; ownership is transferred to the system.
    # The _origin_ is a constant indicating the origin of the data, one of
    # +FROM_SELECTION+, +FROM_CLIPBOARD+ or +FROM_DRAGNDROP+.
    # The _type_ is a previously registered drag type.
    def setDNDData(origin, type, data) ; end

    # Return +true+ if this window logically contains the given point (_parentX_, _parentY_).
    def contains?(parentX, parentY) ; end

    # Translate coordinates (_fromX_, _fromY_) from _fromWindow_'s coordinate system
    # to this window's coordinate system. Returns a two-element array containing the
    # coordinates in this window's coordinate system.
    def translateCoordinatesFrom(fromWindow, fromX, fromY) ; end

    # Translate coordinates (_fromX_, _fromY_) from this window's coordinate system
    # to _toWindow_'s coordinate system. Returns a two-element array containing the
    # coordinates in _toWindow_'s coordinate system.
    def translateCoordinatesTo(toWindow, fromX, fromY) ; end

    # Return +true+ if this window does save-unders.
    def doesSaveUnder?() ; end

    #
    # Translate message for localization; using the current FXTranslator,
    # an attempt is made to translate the given message into the current
    # language.  An optional hint may be passed to break any ties in case
    # more than one tranlation is possible for the given message text.
    # In addition, the name of the widget is passed as context name so
    # that controls in a single dialog may be grouped together.
    #
    def tr(message, hint=nil); end
  end
end