module Sketchup

  # The {Behavior} class is used to control the "behavior" of components, which
  # roughly correlates to the series of options that you see in the Components
  # dialog under the "edit" tab, such as whether it casts shadows, glues to
  # walls, etc.
  #
  # A {Behavior} object is accessed from a {ComponentDefinition} object, not
  # created with a <tt>Behavior.new</tt> call.
  #
  # @example
  #   # Grab the Behavior object from the first component definition.
  #   model = Sketchup.active_model
  #   definition = model.definitions[0]
  #   behavior = definition.behavior
  #
  # @see http://www.sketchup.com/intl/en/developer/docs/ourdoc/behavior Behavior
  #
  # @since SketchUp 6.0
  class Behavior < Entity

    # Set the always-face-camera behavior for a component.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.always_face_camera = false
    #
    # @param [Boolean] state +true+ to enable always-face-camera behavior,
    #   +false+ to disable always-face-camera behavior.
    #
    # @return [Object] The newly assigned value.
    def always_face_camera=(state)
    end

    # Determine if the always-face-camera behavior is enabled. If the
    # always-face-camera behavior is true, then a component will always try to
    # orient itself so that the -Y axis of the component is facing the camera.
    #
    # @example
    #   model = Sketchup.active_model
    #   # Returns a DefinitionList
    #   definitions = model.definitions
    #   path = Sketchup.find_support_file "Bed.skp", "Components/Components Sampler/"
    #
    #   begin
    #     definition = definitions.load path
    #   rescue
    #     UI.messagebox $!.message
    #   end
    #
    #   behavior = definition.behavior
    #   b = behavior.always_face_camera?
    #   if (b)
    #     UI.messagebox b
    #   else
    #     UI.messagebox "Always Face Camera is equal to false"
    #   end
    #   status = behavior.always_face_camera = true
    #   b = behavior.always_face_camera?
    #   if (b)
    #     UI.messagebox b
    #   else
    #     UI.messagebox "Failure"
    #   end
    #
    # @return [Boolean] +true+ if the component is set to always face the camera
    #   or +false+ if the component is not set to always face the camera.
    def always_face_camera?
    end

    # Set the cut-openings behavior for a component.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.cuts_opening = false
    #   if (status)
    #     # if status is true, print the status
    #     UI.messagebox status
    #   else
    #     # code to respond cuts_opening being false
    #   end
    #
    # @param [Boolean] state +true+ to enable cuts openings, +false+ to disable
    #   cuts-openings.
    #
    # @return [Object] The newly assigned value.
    def cuts_opening=(state)
    end

    # Determine if the cuts-openings behavior is set for a component.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.cuts_opening?
    #   if (status)
    #     # if status is true, do something
    #   else
    #     # if status is false, do something else
    #   end
    #
    # @return [Boolean] +true+ if cuts-openings behavior is set or +false+ if
    #   cuts-openings behavior is not set.
    def cuts_opening?
    end

    # Set the 2D behavior for a component: whether it can be glued or aligned to
    # a face.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.is2d = false
    #   if (status)
    #     # if status is true, print the status
    #     UI.messagebox status
    #   else
    #     # code to respond is2d behavior being false
    #   end
    #
    # @param [Boolean] state +true+ to enable 2D behavior, +false+ to disalbe 2D
    #   behavior.
    #
    # @return [Object] The newly assigned value.
    def is2d=(state)
    end

    # Determine if the 2D behavior is set: whether it can be glued or aligned to
    # a face.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.is2d?
    #   if (status)
    #     # if status is true, do something
    #   else
    #     # if status is false, do something else
    #   end
    #
    # @return [Boolean] The status of the 2D behavior.
    def is2d?
    end

    # Set an integer that is really a bit-by-bit description of which scale tool
    # handles are hidden on a given component. This is useful for creating
    # definitions that can only be scaled in particular ways. If a bit contains
    # a 1, then a certain handle set will be hidden when the user selects the
    # component and activates the Scale tool. Here is the map of which bits
    # control which handles.
    #   Bit0: disable scale along red (X),
    #   Bit1: disable scale along green (Y),
    #   Bit2: disable scale along blue (Z),
    #   Bit3: disable scale in red/blue plane (X+Z),
    #   Bit4: disable scale in green/blue plane (Y+Z),
    #   Bit5: disable scale in red/green plane (X+Y),
    #   Bit6: disable scale uniform (from corners) (XYZ).
    #
    # @note For 2-dimensional components (such as face-me components), not all
    #   of the handles in the list above are even used. Also, if the component
    #   you are modifying is already selected with the scale tool, then you or
    #   your user must deactivate and reactivate the scale tool for your new
    #   behavior to take effect.
    #
    # @example
    #   # Disable the green and red-axes handles by setting bits 1 and 2 to 1.
    #   definition = Sketchup.active_model.definitions[0]
    #   behavior = definition.behavior
    #   behavior.no_scale_mask = (1 << 1) + (1 << 2)
    #
    # @param [Fixnum] scale_mask An integer describing which scale tool handles
    #   are hidden.
    #
    # @return [Object] The newly assigned value.
    #
    # @since Sketchup 7.0
    def no_scale_mask=(scale_mask)
    end

    # Get an integer that is a bit-by-bit description of which scale tool
    # handles are hidden when the user selects this single component with the
    # scale tool. See the {#no_scale_mask=} method for details on the bit
    # encodings used.
    #
    # @example
    #   definition = Sketchup.active_model.definitions[0]
    #   behavior = definition.behavior
    #   no_scale_mask = behavior.no_scale_mask?
    #
    # @return [Fixnum] An integer describing which scale tool handles are
    #   hidden.
    #
    # @since Sketchup 7.0
    def no_scale_mask?
    end

    # Identify whether the component's shadow will be cast from the component's
    # current position as though the component were facing the sun. See the
    # Component entity within the SketchUp User's guide for more information on
    # this feature.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   behavior.shadows_face_sun = true
    #
    # @param [Boolean] status +true+ if the component's shadow is to be cast
    #   from the component's current position as though the component were
    #   facing the sun, +false+ to cause the shadow to be cast from the
    #   component's current position.
    #
    # @return [Object] The newly assigned value.
    def shadows_face_sun=(status)
    end

    # Determine whether the component's shadow is being cast from the
    # component's current position (as though the component were facing the
    # sun). See the Component entity within the SketchUp User's guide for more
    # information on this feature.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.shadows_face_sun?
    #
    # @return [Boolean] +true+ if the component's shadow is to be cast from the
    #   component's current position as though the component were facing the sun
    #   or +false+ if the shadow is to be cast from the component's current
    #   position.
    def shadows_face_sun?
    end

    # Get components "snap to" behavior. Returns a constant indicating the
    # snapping behavior of the component described by behavior. Snapping
    # behavior is how the x-y plane of a component instance will be snapped
    # against a face. Possible values are:
    #   SnapTo_Arbitrary  (0) => Snap to any arbitrary face.
    #   SnapTo_Horizontal (1) => Snap to horizontal face like floors.
    #   SnapTo_Vertical   (2) => Snap to vertical face like walls.
    #   SnapTo_Sloped     (3) => Snap to sloped face like sloping roofs.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   status = behavior.snapto
    #   if (status)
    #     # if status is true, do something
    #   else
    #     # if status is false, do something else
    #   end
    #
    # @return [Fixnum] A constant identifying one of the snapto types.
    def snapto
    end

    # Set components "snap to" behavior. Snapping behavior is how the x-y plane
    # of a component instance will be snapped against a face. Possible constant
    # values are:
    #   SnapTo_Arbitrary  (0) => Snap to any arbitrary face.
    #   SnapTo_Horizontal (1) => Snap to horizontal face like floors.
    #   SnapTo_Vertical   (2) => Snap to vertical face like walls.
    #   SnapTo_Sloped     (3) => Snap to sloped face like sloping roofs.
    #
    # @example
    #   model = Sketchup.active_model
    #   behavior = model.definitions[0].behavior
    #   behavior.snapto = SnapTo_Horizontal
    #
    # @param [Fixnum] type A constant identifying one of the snapto types.
    #
    # @return [Object] The newly assigned value.
    def snapto=(type)
    end

  end # class Behavior < Entity
end # module Sketchup