Sha256: 05b09512d6f7f47b3ad56564eccd199988bc5454586abcfb9ab59ce36894134c

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

class Shoes
  module Swt
    module Common
      module Clickable

        attr_accessor :click_listener

        # object = self is there for compatibility reasons for now
        # it's for link (defined in text.rb) and the listener is added in the
        # swt/text_block.rb ... moving it around would be too hard now
        def clickable(object = self, block)
          add_listener_for object, ::Swt::SWT::MouseDown, block
        end

        def click(&block)
          add_listener_for ::Swt::SWT::MouseDown, block
        end

        def release(&block)
          add_listener_for ::Swt::SWT::MouseUp, block
        end

        private
        def add_listener_for(swt_object = self, event, block)
          # dsl objects take care of in bounds checking etc.
          dsl_object = swt_object.dsl
          listener = ClickListener.new(dsl_object, block)
          swt_object.click_listener = listener
          app.add_clickable_element dsl_object
          app.add_listener event, listener
        end

        def remove_listener_for(swt_object = self, event)
          dsl_object = swt_object.dsl
          app.clickable_elements.delete(dsl_object)
          app.remove_listener ::Swt::SWT::MouseDown, swt_object.click_listener
          app.remove_listener ::Swt::SWT::MouseUp, swt_object.click_listener
        end

        class ClickListener
          include ::Swt::Widgets::Listener

          def initialize(clickable_object, block)
            @clickable_object = clickable_object
            @block            = block
          end

          def handleEvent(mouse_event)
            if @clickable_object.in_bounds?(mouse_event.x, mouse_event.y)
              eval_block mouse_event
            end
          end

          def eval_block(mouse_event)
            @block.call mouse_event.button, mouse_event.x, mouse_event.y
          end
        end

      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
shoes-4.0.0.pre1 lib/shoes/swt/common/clickable.rb