module Canis::EventHandler

Public Instance Methods

add_binding()
Alias for: bind
bind() click to toggle source

bind an event to a block, optional args will also be passed when calling

# File lib/canis/core/widgets/rwidget.rb, line 939
def bind event, *xargs, &blk
  #$log.debug "#{self} called EventHandler BIND #{event}, args:#{xargs} "
  if @_events
    $log.warn "bind: #{self.class} does not support this event: #{event}. #{@_events} " if !event? event
    #raise ArgumentError, "#{self.class} does not support this event: #{event}. #{@_events} " if !event? event
  else
    # it can come here if bind in initial block, since widgets add to @_event after calling super
    # maybe we can change that.
    $log.warn "BIND #{self.class} (#{event})  XXXXX no events defined in @_events. Please do so to avoid bugs and debugging. This will become a fatal error soon."
  end
  @handler ||= {}
  @event_args ||= {}
  @handler[event] ||= []
  @handler[event] << blk
  @event_args[event] ||= []
  @event_args[event] << xargs
end
Also aliased as: add_binding
event?(eve) click to toggle source

returns boolean depending on whether this widget has registered the given event

# File lib/canis/core/widgets/rwidget.rb, line 1043
def event? eve
  @_events.include? eve
end
event_list() click to toggle source

returns event list for this widget

# File lib/canis/core/widgets/rwidget.rb, line 1048
def event_list
  @_events
end
fire_handler(event, object) click to toggle source

Fire all bindings for given event e.g. fire_handler :ENTER, self The first parameter passed to the calling block is either self, or some action event The second and beyond are any objects you passed when using `bind` or `command`. Exceptions are caught here itself, or else they prevent objects from updating, usually the error is in the block sent in by application, not our error. TODO: if an object throws a subclass of VetoException we should not catch it and throw it back for caller to catch and take care of, such as prevent LEAVE or update etc.

# File lib/canis/core/widgets/rwidget.rb, line 970
def fire_handler event, object
  $log.debug "inside def fire_handler evt:#{event}, o: #{object.class}"
  if !@handler.nil?
    if @_events
      raise ArgumentError, "fire_handler: #{self.class} does not support this event: #{event}. #{@_events} " if !event? event
    else
      $log.debug "bIND #{self.class}  XXXXX TEMPO no events defined in @_events "
    end
    ablk = @handler[event]
    if !ablk.nil?
      aeve = @event_args[event]
      ablk.each_with_index do |blk, ix|
        #$log.debug "#{self} called EventHandler firehander #{@name}, #{event}, obj: #{object},args: #{aeve[ix]}"
        $log.debug "#{self} called EventHandler firehander #{@name}, #{event}"
        begin
          blk.call object,  *aeve[ix]
        rescue FieldValidationException => fve
          # added 2011-09-26 1.3.0 so a user raised exception on LEAVE
          # keeps cursor in same field.
          raise fve
        rescue PropertyVetoException => pve
          # added 2011-09-26 1.3.0 so a user raised exception on LEAVE
          # keeps cursor in same field.
          raise pve
        rescue => ex
          ## some don't have name
          #$log.error "======= Error ERROR in block event #{self}: #{name}, #{event}"
          $log.error "======= Error ERROR in block event #{self}:  #{event}"
          $log.error ex
          $log.error(ex.backtrace.join("\n")) 
          #$error_message = "#{ex}" # changed 2010
          $error_message.value = "#{ex.to_s}"
          Ncurses.beep
        end
      end
    else
      # there is no block for this key/event
      # we must behave exactly as processkey
      # NOTE this is too risky since then buttons and radio buttons
      # that don't have any command don;t update,so removing 2011-12-2
      #return :UNHANDLED
      return :NO_BLOCK
    end # if
  else
    # there is no handler
    # I've done this since list traps ENTER but rarely uses it.
    # For buttons default, we'd like to trap ENTER even when focus is elsewhere
    # we must behave exactly as processkey
    # NOTE this is too risky since then buttons and radio buttons
    # that don't have any command don;t update,so removing 2011-12-2
    #return :UNHANDLED
    # If caller wants, can return UNHANDLED such as list and ENTER.
    return :NO_BLOCK
  end # if
end
fire_property_change(text, oldvalue, newvalue) click to toggle source

goes with dsl_property Can throw a FieldValidationException or PropertyVetoException

# File lib/canis/core/widgets/rwidget.rb, line 1027
def fire_property_change text, oldvalue, newvalue
  return if @_object_created.nil? #  2018-05-15 - removed check for nil, as object can be nil on creation
                                  # but set later.
  #$log.debug " FPC #{self}: #{text} #{oldvalue}, #{newvalue}"
  $log.debug " FPC #{self}: #{text} "
  if @pce.nil?
    @pce = PropertyChangeEvent.new(self, text, oldvalue, newvalue)
  else
    @pce.set( self, text, oldvalue, newvalue)
  end
  fire_handler :PROPERTY_CHANGE, @pce
  @repaint_required = true 
  repaint_all(true) # for repainting borders, headers etc 2011-09-28 V1.3.1
end
register_events(eves) click to toggle source

widgets may register their events prior to calling super 2014-04-17 - 20:54 Earlier they were writing directly to a data structure after super.

# File lib/canis/core/widgets/rwidget.rb, line 926
def register_events eves
  @_events ||= []
  case eves
  when Array
    @_events.push(*eves)
  when Symbol
    @_events << eves
  else
    raise ArgumentError "register_events: Don't know how to handle #{eves.class}"
  end
end