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
  
    # Return child window with given window key
    def getChildWithKey(key); 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 +true+ if the cursor is shown.
    def cursorShown?; end

    #
    # Set the cursor's visibility to +true+ or +false+.
    #
    def cursorShown=(flag); 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();
    
    # 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
