module Fox
  #
  # An FXGradientBar widget is defined in part by its array of "segments",
  # each of which is an FXGradient instance. An FXGradient instance defines
  # the properties of one segment, namely, the lower, middle and upper
  # values (all Floats); the lower and upper color values; and the blending
  # mode for the segment.
  #
  class FXGradient
    # Lower value [Float]
    attr_accessor :lower
    
    # Middle value [Float]
    attr_accessor :middle
    
    # Upper value [Float]
    attr_accessor :upper
    
    # Lower color [FXColor]
    attr_accessor :lowerColor
    
    # Upper color [FXColor]
    attr_accessor :upperColor
    
    # Blend mode [Integer]
    attr_accessor :blend
  end

  #
  # The FXGradientBar is a control that is used to edit color gradient,
  # such as used in texture mapping and shape filling.
  #
  # === Events
  #
  # The following messages are sent by FXGradientBar 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_CHANGED+::		sent when anything about a segment changes; the message data is an integer indicating the segment number
  # +SEL_SELECTED+::		sent when one or more segments are selected.
  # +SEL_DESELECTED+::		sent when one or more segments are deselected.
  #
  # === Gradient bar orientation
  #
  # +GRADIENTBAR_HORIZONTAL+::		Gradient bar shown horizontally
  # +GRADIENTBAR_VERTICAL+::		Gradient bar shown vertically
  # +GRADIENTBAR_NO_CONTROLS+::		No controls shown
  # +GRADIENTBAR_CONTROLS_TOP+::	Controls on top
  # +GRADIENTBAR_CONTROLS_BOTTOM+::	Controls on bottom
  # +GRADIENTBAR_CONTROLS_LEFT+::	Controls on left
  # +GRADIENTBAR_CONTROLS_RIGHT+::	Controls on right
  #
  # === Blend modes
  #
  # +GRADIENT_BLEND_LINEAR+::		Linear blend
  # +GRADIENT_BLEND_POWER+::		Power law blend
  # +GRADIENT_BLEND_SINE+::		Sine blend
  # +GRADIENT_BLEND_INCREASING+::	Quadratic increasing blend
  # +GRADIENT_BLEND_DECREASING+::	Quadratic decreasing blend
  #
  # === Message identifiers
  #
  # +ID_LOWER_COLOR+::			write me
  # +ID_UPPER_COLOR+::			write me
  # +ID_BLEND_LINEAR+::			write me
  # +ID_BLEND_POWER+::			write me
  # +ID_BLEND_SINE+::			write me
  # +ID_BLEND_INCREASING+::		write me
  # +ID_BLEND_DECREASING+::		write me
  # +ID_RECENTER+::			write me
  # +ID_SPLIT+::			write me
  # +ID_MERGE+::		 	write me
  # +ID_UNIFORM+::			write me
  #
  class FXGradientBar < FXFrame
  
    #
    # Gradient bar style, some combination of +GRADIENTBAR_HORIZONTAL+,
    # +GRADIENTBAR_VERTICAL+, +GRADIENTBAR_NO_CONTROLS+,
    # +GRADIENTBAR_CONTROLS_TOP+, +GRADIENTBAR_CONTROLS_BOTTOM+,
    # +GRADIENTBAR_CONTROLS_LEFT+ and +GRADIENTBAR_CONTROLS_RIGHT+.
    #
    attr_accessor :barStyle
    
    # Bar size [Integer]
    attr_accessor :barSize
    
    # Control size [Integer]
    attr_accessor :controlSize
    
    # Selection color [FXColor]
    attr_accessor :selectColor
    
    # Status line help text [String]
    attr_accessor :helpText
    
    # Tool tip text [String]
    attr_accessor :tipText

    #
    # Return an initialized FXGradientBar instance.
    #
    def initialize(p, target=nil, selector=0, opts=FRAME_NORMAL, x=0, y=0, width=0, height=0, padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD) # :yields: theGradientBar
    end
    
    #
    # Return the zero-based index of the segment containing location (_x_, _y_).
    # Returns -1 if no matching segment was found.
    #
    def getSegment(x, y); end

    #
    # Return the grip in segment _seg_ which is closest to location (_x_, _y_),
    # one of +GRIP_LOWER+, +GRIP_SEG_LOWER+, +GRIP_MIDDLE+, +GRIP_SEG_UPPER+,
    # +GRIP_UPPER+ or +GRIP_NONE+.
    #
    def getGrip(seg, x, y); end

    # Return the number of segments
    def numSegments(); end

    #
    # Replace the current gradient segments with _segments_, an array of
    # FXGradient instances.
    #
    def gradients=(segments); end

    #
    # Return a reference to the array of gradient segments (an array of
    # FXGradient instances).
    #
    def gradients(); end

    #
    # Change current segment to _index_. Use an _index_ of -1 to indicate that there
    # is no current segment.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the current segment is changed.
    # Raises IndexError if _index_ is out of bounds.
    # 
    def setCurrentSegment(index, notify=false); end

    #
    # Return the index of the current segment, or -1 if there is no current segment.
    #
    def getCurrentSegment(); end

    #
    # Change anchor segment to _seg_.
    # Use a _seg_ value of -1 to indicate that there is no anchor segment.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def anchorSegment=(seg); end

    #
    # Return the index of the anchor segment, or -1 if there is no anchor segment.
    #
    def anchorSegment(); end

    #
    # Select segment(s) _fm_ through _to_ and return +true+ if the selected range
    # is different than it was.
    # If _notify_ is +true+, a +SEL_SELECTED+ message is sent to the gradient bar's
    # message target after the current segment is changed.
    # Raises ArgumentError if _fm_ is greater than _to_, and
    # IndexError if either _fm_ or _to_ is out of bounds.
    #
    def selectSegments(fm, to, notify=false); end

    #
    # Deselect all segments, and return +true+ if there was a previously
    # selected range.
    # If _notify_ is +true+, a +SEL_DESELECTED+ message is sent to the gradient bar's
    # message target after the current selection is deselected.
    #
    def deselectSegments(notify); end

    #
    # Return +true+ if the specified segment is selected.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def segmentSelected?(seg); end

    #
    # Set lower color of the segment with index _seg_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segment's lower color is changed.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def setSegmentLowerColor(seg, clr, notify=false); end
  
    #
    # Set upper color of the segment with index _seg_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segment's upper color is changed.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def setSegmentUpperColor(seg, clr, notify=false); end

    #
    # Return lower color of the segment with index _seg_.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentLowerColor(seg); end
  
    #
    # Return upper color of the segment with index _seg_.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentUpperColor(seg); end

    #
    # Move lower point of segment _seg_ to _val_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segment's lower value is changed.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def moveSegmentLower(seg, val, notify=false); end

    #
    # Move middle point of segment _seg_ to _val_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segment's middle value is changed.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def moveSegmentMiddle(seg, val, notify=false); end

    #
    # Move upper point of segment _seg_ to _val_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segment's upper value is changed.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def moveSegmentUpper(seg, val, notify=false); end

    #
    # Move segments _sglo_ to _sghi_ to new position _val_.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after the segments' values are changed.
    #
    def moveSegments(sglo, sghi, val, notify=false); end

    #
    # Return lower value of segment _seg_.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentLower(seg); end
  
    #
    # Return middle value of segment _seg_.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentMiddle(seg); end
  
    #
    # Return upper value of segment _seg_.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentUpper(seg); end

    #
    # Return a gradient ramp of size _nramp_ based on the settings for this
    # gradient bar. The return value is an array of color values corresponding
    # to this gradient bar.
    #
    def gradient(nramp); end

    #
    # Return the blend mode of segment _seg_, one of +GRADIENT_BLEND_LINEAR+,
    # +GRADIENT_BLEND_POWER+, +GRADIENT_BLEND_SINE+, +GRADIENT_BLEND_INCREASING+
    # or +GRADIENT_BLEND_DECREASING+.
    # Raises IndexError if _seg_ is out of bounds.
    #
    def getSegmentBlend(seg); end

    #
    # Split segment at the midpoint
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after this change is completed.
    #
    def splitSegments(sglo, sghi, notify=false); end

    #
    # Merge segments.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after this change is completed.
    #
    def mergeSegments(sglo, sghi, notify=false); end

    #
    # Make segments uniformly distributed.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after this change is completed.
    #
    def uniformSegments(sglo, sghi, notify=false); end

    #
    # Set the blend mode for segments _sglo_ through _sghi_ to _blend_, where
    # _blend_ is one of +GRADIENT_BLEND_LINEAR+,
    # +GRADIENT_BLEND_POWER+, +GRADIENT_BLEND_SINE+, +GRADIENT_BLEND_INCREASING+
    # or +GRADIENT_BLEND_DECREASING+.
    # If _notify_ is +true+, a +SEL_CHANGED+ message is sent to the gradient bar's
    # message target after this change is completed.
    #
    def blendSegments(sglo, sghi, blend=GRADIENT_BLEND_LINEAR, notify=false); end
  end
end
