module Fox
  #
  # Highlight style entry
  #
  class FXHiliteStyle
    # Normal text foreground color [FXColor]
    attr_accessor	:normalForeColor

    # Normal text background color [FXColor]
    attr_accessor	:normalBackColor

    # Selected text foreground color [FXColor]
    attr_accessor	:selectForeColor

    # Selected text background color [FXColor]
    attr_accessor	:selectBackColor

    # Highlight text foreground color [FXColor]
    attr_accessor	:hiliteForeColor

    # Highlight text background color [FXColor]
    attr_accessor	:hiliteBackColor

    # Active text background color [FXColor]
    attr_accessor	:activeBackColor

    # Highlight text style [Integer]
    attr_accessor	:style
  end

  #
  # Text mutation callback data passed with the SEL_INSERTED,
  # SEL_REPLACED, and SEL_DELETED messages; both old and new
  # text is available on behalf of the undo system as well as
  # syntax highlighting.
  #
  class FXTextChange
    # Position in buffer [Integer]
    attr_accessor :pos
    
    # Number of characters deleted at _pos_ [Integer]
    attr_accessor :ndel
    
    # Number of characters inserted at _pos_ [Integer]
    attr_accessor :nins
    
    # Text inserted at _pos_ [String]
    attr_accessor :ins
    
    # Text deleted as _pos_ [String]
    attr_accessor :del
  end

  #
  # The text widget supports editing of multiple lines of text.
  # An optional style table can provide text coloring based on
  # the contents of an optional parallel style buffer, which is
  # maintained as text is edited.  In a typical scenario, the
  # contents of the style buffer is either directly written when
  # the text is added to the widget, or is continually modified
  # by editing the text via syntax-based highlighting engine which
  # colors the text based on syntactical patterns.
  #
  # === Events
  #
  # The following messages are sent by FXText to its target:
  #
  # +SEL_KEYPRESS+::		sent when a key is pressed; the message data is an FXEvent instance.
  # +SEL_KEYRELEASE+::		sent when a key is released; the message data is an FXEvent instance.
  # +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_INSERTED+::
  #   sent after text is inserted into the text buffer; the message data
  #   is a reference to an FXTextChange instance.
  # +SEL_DELETED+::
  #   sent after text is removed from the text buffer; the message data is
  #   a reference to an FXTextChange instance.
  # +SEL_REPLACED+::
  #   sent after some text is replaced in the text buffer; the message data is
  #   a reference to an FXTextChange instance.
  # +SEL_CHANGED+::
  #   sent when the contents of the text buffer change in any way;
  #   the message data is an integer indicating the cursor position.
  # +SEL_SELECTED+::
  #   sent after text is selected; the message data is a two-element array
  #   indicating the starting position of the selected text and the number
  #   of characters selected.
  # +SEL_DESELECTED+::
  #   sent before text is deselected; the message data is a two-element array
  #   indicating the starting position of the deselected text and the number
  #   of characters deselected.
  #
  # === Text widget options
  #
  # +TEXT_READONLY+::	Text is _not_ editable
  # +TEXT_WORDWRAP+::	Wrap at word breaks
  # +TEXT_OVERSTRIKE+::	Overstrike mode
  # +TEXT_FIXEDWRAP+::	Fixed wrap columns
  # +TEXT_NO_TABS+::	Insert spaces for tabs
  # +TEXT_AUTOINDENT+::	Autoindent
  # +TEXT_SHOWACTIVE+::	Show active line
  # +TEXT_AUTOSCROLL+::	Logging mode, keeping last line visible
  #
  # === Selection modes
  #
  # +SELECT_CHARS+
  # +SELECT_WORDS+
  # +SELECT_LINES+
  #
  # === Text styles
  #
  # +STYLE_UNDERLINE+::		underline text
  # +STYLE_STRIKEOUT+::		strike out text
  # +STYLE_BOLD_+::			bold text
  #
  # === Message identifiers
  #
  # +ID_CURSOR_TOP+::
  # +ID_CURSOR_BOTTOM+::
  # +ID_CURSOR_HOME+::
  # +ID_CURSOR_END+::
  # +ID_CURSOR_RIGHT+::
  # +ID_CURSOR_LEFT+::
  # +ID_CURSOR_UP+::
  # +ID_CURSOR_DOWN+::
  # +ID_CURSOR_WORD_LEFT+::
  # +ID_CURSOR_WORD_RIGHT+::
  # +ID_CURSOR_PAGEDOWN+::
  # +ID_CURSOR_PAGEUP+::
  # +ID_CURSOR_SCRNTOP+::
  # +ID_CURSOR_SCRNBTM+::
  # +ID_CURSOR_SCRNCTR+::
  # +ID_CURSOR_PAR_HOME+::
  # +ID_CURSOR_PAR_END+::
  # +ID_SCROLL_UP+::
  # +ID_SCROLL_DOWN+::
  # +ID_MARK+::
  # +ID_EXTEND+::
  # +ID_OVERST_STRING+::
  # +ID_INSERT_STRING+::
  # +ID_INSERT_NEWLINE+::
  # +ID_INSERT_TAB+::
  # +ID_CUT_SEL+::
  # +ID_COPY_SEL+::
  # +ID_PASTE_SEL+::
  # +ID_DELETE_SEL+::
  # +ID_SELECT_CHAR+::
  # +ID_SELECT_WORD+::
  # +ID_SELECT_LINE+::
  # +ID_SELECT_ALL+::
  # +ID_SELECT_MATCHING+::
  # +ID_SELECT_BRACE+::
  # +ID_SELECT_BRACK+::
  # +ID_SELECT_PAREN+::
  # +ID_SELECT_ANG+::
  # +ID_DESELECT_ALL+::
  # +ID_BACKSPACE+::
  # +ID_BACKSPACE_WORD+::
  # +ID_BACKSPACE_BOL+::
  # +ID_DELETE+::
  # +ID_DELETE_WORD+::
  # +ID_DELETE_EOL+::
  # +ID_DELETE_LINE+::
  # +ID_TOGGLE_EDITABLE+::
  # +ID_TOGGLE_OVERSTRIKE+::
  # +ID_CURSOR_ROW+::
  # +ID_CURSOR_COLUMN+::
  # +ID_CLEAN_INDENT+::
  # +ID_SHIFT_LEFT+::
  # +ID_SHIFT_RIGHT+::
  # +ID_SHIFT_TABLEFT+::
  # +ID_SHIFT_TABRIGHT+::
  # +ID_UPPER_CASE+::
  # +ID_LOWER_CASE+::
  # +ID_GOTO_MATCHING+::
  # +ID_GOTO_SELECTED+::
  # +ID_GOTO_LINE+::
  # +ID_SEARCH_FORW_SEL+::
  # +ID_SEARCH_BACK_SEL+::
  # +ID_SEARCH+::
  # +ID_REPLACE+::
  # +ID_LEFT_BRACE+::
  # +ID_LEFT_BRACK+::
  # +ID_LEFT_PAREN+::
  # +ID_LEFT_ANG+::
  # +ID_RIGHT_BRACE+::
  # +ID_RIGHT_BRACK+::
  # +ID_RIGHT_PAREN+::
  # +ID_RIGHT_ANG+::
  # +ID_BLINK+::
  # +ID_FLASH+::

  class FXText < FXScrollArea
  
    # Top margin [Integer]
    attr_accessor	:marginTop

    # Bottom margin [Integer]
    attr_accessor	:marginBottom

    # Left margin [Integer]
    attr_accessor	:marginLeft

    # Right margin [Integer]
    attr_accessor	:marginRight

    # Wrap columns [Integer]
    attr_accessor	:wrapColumns

    # Tab columns [Integer]
    attr_accessor	:tabColumns

    # Number of columns used for line numbers [Integer]
    attr_accessor	:barColumns

    # Indicates whether text is modified [Boolean]
    attr_writer		:modified

    # Indicates whether text is editable [Boolean]
    attr_writer		:editable

    # Indicates whether text is styled [Boolean]
    attr_writer		:styled

    # Word delimiters [String]
    attr_accessor	:delimiters

    # Text font [FXFont]
    attr_accessor	:font

    # Text color [FXColor]
    attr_accessor	:textColor

    # Selected text background color [FXColor]
    attr_accessor	:selBackColor

    # Selected text color [FXColor]
    attr_accessor	:selTextColor

    # Highlight text color [FXColor]
    attr_accessor	:hiliteTextColor

    # Highlight text background color [FXColor]
    attr_accessor	:hiliteBackColor

    # Active background color [FXColor]
    attr_accessor	:activeBackColor

    # Cursor color [FXColor]
    attr_accessor	:cursorColor

    # Line number color [FXColor]
    attr_accessor	:numberColor

    # Bar color [FXColor]
    attr_accessor	:barColor

    # Status line help text [String]
    attr_accessor	:helpText

    # Tool tip message [String]
    attr_accessor	:tipText

    # The text buffer [String]
    attr_accessor	:text

    # The length of the text buffer [Integer]
    attr_reader		:length

    # Anchor position [Integer]
    attr_accessor	:anchorPos

    # Cursor row [Integer]
    attr_accessor	:cursorRow

    # Cursor column [Integer]
    attr_accessor	:cursorCol

    # Cursor position [Integer]
    attr_reader		:cursorPos

    # Selection start position [Integer]
    attr_reader		:selStartPos

    # Selection end position [Integer]
    attr_reader		:selEndPos

    # Text widget style [Integer]
    attr_accessor	:textStyle

    # Number of visible rows [Integer]
    attr_accessor	:visibleRows

    # Number of visible columns [Integer]
    attr_accessor	:visibleColumns

    #
    # Brace and parenthesis match highlighting time, in milliseconds [Integer].
    # A _hiliteMatchTime_ of 0 disables brace matching.
    #
    attr_accessor	:hiliteMatchTime

    # Array of hilite styles [an Array of FXHiliteStyle instances]
    attr_accessor	:hiliteStyles

    #
    # Return an initialized FXText instance.
    #
    # ==== Parameters:
    #
    # +p+::	the parent window for this text widget [FXComposite]
    # +tgt+::	the message target, if any, for this text widget [FXObject]
    # +sel+::	the message identifier for this text widget [Integer]
    # +opts+::	tree list options [Integer]
    # +x+::	initial x-position [Integer]
    # +y+::	initial y-position [Integer]
    # +w+::	initial width [Integer]
    # +h+::	initial height [Integer]
    #
    def initialize(p, tgt=nil, sel=0, opts=0, x=0, y=0, w=0, h=0, pl=3, pr=3, pt=2, pb=2) # :yields: theText
    end
    
    # Return +true+ if text was modified
    def modified? ; end
    
    # Return +true+ if text is editable
    def editable? ; end
    
    # Set overstrike mode to +true+ or +false+.
    def overstrike=(os); end
    
    # Return +true+ if overstrike mode is activated.
    def overstrike? ; end

    # Return +true+ if styled text
    def styled? ; end

    # Get character at position _pos_ in text buffer
    def getByte(pos); end
  
    # Get wide character at position _pos_.
    def getChar(pos); end

    # Get length of wide character at position _pos_.
    def getCharLen(pos); end

    # Get style at position _pos_ in style buffer
    def getStyle(pos); end

    # Extract _n_ bytes of text from position _pos_ in the text buffer
    def extractText(pos, n); end
    
    # Extract _n_ bytes of style info from position _pos_ in the style buffer
    def extractStyle(pos, n); end

    # Replace the _m_ characters at _pos_ with _text_.
    # If _notify_ is +true+, a +SEL_DELETED+ message is sent to the text
    # widget's message target before the old text is removed, and a
    # +SEL_INSERTED+ and +SEL_CHANGED+ message is sent after the new
    # text is inserted.
    def replaceText(pos, m, text, notify=false); end
  
    # Replace the _m_ characters at _pos_ with _text_.
    # If _notify_ is +true+, a +SEL_DELETED+ message is sent to the text
    # widget's message target before the old text is removed, and a
    # +SEL_INSERTED+ and +SEL_CHANGED+ message is sent after the new
    # text is inserted.
    def replaceStyledText(pos, m, text, style=0, notify=false); end
  
    # Append _text_ to the end of the text buffer.
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # added.
    def appendText(text, notify=false); end
  
    # Append _text_ to the end of the text buffer.
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # added.
    def appendStyledText(text, style=0, notify=false); end
  
    # Insert _text_ at position _pos_ in the text buffer.
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # inserted.
    def insertText(pos, text, notify=false); end
  
    # Insert _text_ at position _pos_ in the text buffer.
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # inserted.
    def insertStyledText(pos, text, style=0, notify=false); end

    # Remove _n_ characters of text at position _pos_ in the buffer
    # If _notify_ is +true+, a +SEL_DELETED+ message is sent to the
    # text widget's message target before the text is removed and a
    # +SEL_CHANGED+ message is sent after the change occurs.
    def removeText(pos, n, notify=false); end
  
    # Change the style of _n_ characters at position _pos_ in the text
    # buffer to _style_. Here, _style_ is  an integer index into the
    # style table, indicating the new style for all the affected characters;
    def changeStyle(pos, n, style); end
  
    # Change the style of text range at position _pos_ in the text
    # buffer to _style_. Here, _style_ an array of bytes indicating
    # the new style.
    def changeStyle(pos, style); end

    # Change the text
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # set.
    def setText(text, notify=false); end
  
    # Change the text in the buffer to new text
    # If _notify_ is +true+, +SEL_INSERTED+ and +SEL_CHANGED+ messages
    # are sent to the text widget's message target after the new text is
    # set.
    def setStyledText(text, style=0, notify=false); end
  
    # Shift block of lines from position _startPos_ up to _endPos_ by given _amount_.
    # If _notify_ is +true+, a +SEL_DELETED+ message is sent to the text
    # widget's message target before the old text is removed, and a
    # +SEL_INSERTED+ and +SEL_CHANGED+ message is sent after the new
    # text is inserted.
    def shiftText(startPos, endPos, amount, notify=false); end

    # Search for _string_ in text buffer, returning the extent of
    # the string in _beg_ and _end_.  The search starts from the given
    # _start_ position, scans forward (+SEARCH_FORWARD+) or backward
    # (+SEARCH_BACKWARD+), and wraps around if +SEARCH_WRAP+ has been
    # specified.  The search type is either a plain search (+SEARCH_EXACT+),
    # case insensitive search (+SEARCH_IGNORECASE+), or regular expression
    # search (+SEARCH_REGEX+).
    # For regular expression searches, capturing parentheses are used if
    # _npar_ is greater than 1; in this case, the number of entries in the
    # _beg_ and _end_ arrays must be _npar_ also.  If either _beg_ or _end_ or
    # both are nil, internal arrays are used.
    def findText(string, beg=nil, end=nil, start=0, flags=SEARCH_FORWARD|SEARCH_WRAP|SEARCH_EXACT, npar=1); end

    # Return +true+ if position _pos_ is selected
    def positionSelected?(pos); end
  
    # Return +true+ if position _pos_ is fully visible
    def positionVisible?(pos); end
  
    # Return text position at given visible (_x_, _y_) coordinate
    def getPosAt(x, y); end
  
    # Count number of rows; _start_ should be on a row start
    def countRows(start, end); end

    # Count number of columns; _start_ should be on a row start
    def countCols(start, end); end

    # Count number of newlines
    def countLines(start, end); end

    # Return position of beginning of line containing position _pos_
    def lineStart(pos); end
  
    # Return position of end of line containing position _pos_
    def lineEnd(pos); end
  
    # Return start of next line
    def nextLine(pos, nl=1); end
  
    # Return start of previous line
    def prevLine(pos, nl=1); end
  
    # Return row start
    def rowStart(pos); end
  
    # Return row end
    def rowEnd(pos); end

    # Return start of next row
    def nextRow(pos, nr=1); end
  
    # Return start of previous row
    def prevRow(pos, nr=1); end
  
    # Return end of previous word
    def leftWord(pos); end
  
    # Return begin of next word
    def rightWord(pos); end
  
    # Return begin of word
    def wordStart(pos); end
  
    # Return end of word
    def wordEnd(pos); end
  
    # Return validated UTF8 character start position
    def validPos(pos); end

    # Retreat to the previous valid UTF8 character start
    def dec(pos); end
  
    # Advance to the next valid UTF8 character start
    def inc(pos); end

    # Make line containing _pos_ the top line
    def setTopLine(pos); end
  
    # Return position of top line
    def getTopLine(); end
  
    # Make line containing _pos_ the bottom line
    def setBottomLine(pos); end
  
    # Return the position of the bottom line
    def getBottomLine(); end
  
    # Make line containing _pos_ the center line
    def setCenterLine(pos); end

    # Set cursor row.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the text
    # widget's message target after the change occurs.
    def setCursorRow(row, notify=false); end
  
    # Set cursor column.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the text
    # widget's message target after the change occurs.
    def setCursorCol(col, notify=false); end

    # Set cursor position.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the text
    # widget's message target after the change occurs.
    def setCursorPos(pos, notify=false); end

    # Select all text.
    # If _notify_ is +true+, a +SEL_DESELECTED+ message is sent to the text
    # widget's message target before any previously selected text is
    # deselected, then a +SEL_SELECTED+ message is sent after the new text
    # is selected.
    def selectAll(notify=false); end
  
    # Select _len_ characters starting at position _pos_.
    # If _notify_ is +true+, a +SEL_DESELECTED+ message is sent to the text
    # widget's message target before any previously selected text is
    # deselected, then a +SEL_SELECTED+ message is sent after the new text
    # is selected.
    def setSelection(pos, len, notify=false); end
  
    # Extend selection to _pos_.
    # If _notify_ is +true+, a +SEL_DESELECTED+ message is sent to the text
    # widget's message target before any previously selected text is
    # deselected, then a +SEL_SELECTED+ message is sent after the new text
    # is selected.
    def extendSelection(pos, textSelectionMode=SELECT_CHARS, notify=false); end
  
    # Kill the selection.
    # If _notify_ is +true+, a +SEL_DESELECTED+ message is sent to the text
    # widget's message target before the text is deselected.
    def killSelection(notify=false); end

    # Highlight _len_ characters starting at position _pos_
    def setHighlight(pos, len); end
  
    # Unhighlight the text
    def killHighlight(); end
  
    # Scroll text to make the given position visible
    def makePositionVisible(pos); end
    
    # Return number of rows in buffer.
    def numRows; end
  end
end
