class Glimmer::SWT::DisplayProxy

Attributes

open_custom_shells_in_current_window[RW]
open_custom_shells_in_current_window?[RW]

Public Class Methods

instance() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 8
def instance
  @instance ||= new
end
new() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 16
def initialize
  # Do not call super
end

Public Instance Methods

async_exec(proc_tracker = nil, &block) click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 73
def async_exec(proc_tracker = nil, &block)
  block = proc_tracker unless proc_tracker.nil?
  queue = nil # general queue
  if !proc_tracker.nil? && proc_tracker.invoked_from.to_s == 'open' && modal_open? &&
     (
       proc_tracker.owner.is_a?(MessageBoxProxy) ||
       (dialog_open? && proc_tracker.owner.is_a?(DialogProxy) && opened_dialogs.last == WidgetProxy.widget_handling_listener&.dialog_ancestor)
     )
    queue = WidgetProxy.widget_handling_listener
  end
  return block.call if !modal_open?
  schedule_async_exec(block, queue)
end
Also aliased as: sync_exec
beep() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 69
def beep
  # TODO (simulate beep from SWT display flashing the screen and making a noise if possible)
end
dialog_open?() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 53
def dialog_open?
  dialogs.any?(&:open?)
end
dialogs() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 41
def dialogs
  @dialogs ||= []
end
element() click to toggle source

Root element representing widget. Must be overridden by subclasses if different from div

# File lib/glimmer/swt/display_proxy.rb, line 25
def element
  'body'
end
listener_dom_element() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 29
def listener_dom_element
  Document
end
message_box_open?() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 49
def message_box_open?
  message_boxes.any?(&:open?)
end
message_boxes() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 37
def message_boxes
  @message_boxes ||= []
end
modal_open?() click to toggle source
modals() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 45
def modals
  message_boxes + dialogs
end
opened_dialogs() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 57
def opened_dialogs
  dialogs.select(&:open?)
end
path() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 20
def path
  "html body"
end
render() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 65
def render
  # No rendering as body is rendered as part of ShellProxy.. this class only serves as an SWT Display utility
end
shells() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 33
def shells
  @shells ||= []
end
sync_exec(proc_tracker = nil, &block)

sync_exec kept for API compatibility reasons

Alias for: async_exec

Private Instance Methods

async_exec_queue(widget_handling_listener = nil) click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 95
def async_exec_queue(widget_handling_listener = nil)
  async_exec_queues[widget_handling_listener] ||= []
end
async_exec_queues() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 91
def async_exec_queues
  @async_exec_queues ||= {}
end
no_widget_handling_listener_work?() click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 99
def no_widget_handling_listener_work?
  async_exec_queues.reject {|key, value| key.nil?}.values.reduce(:+).to_a.empty?
end
schedule_async_exec(block, queue) click to toggle source
# File lib/glimmer/swt/display_proxy.rb, line 103
def schedule_async_exec(block, queue)
  async_exec_queue(queue).unshift(block)
  
  # TODO consider the need for locking to avoid race conditions (rare or impossible case)
  if async_exec_queue(queue).size == 1
    executer = lambda do
      # queue could be a widget handling listener queue
      # TODO see if there are more intricate cases of opening a dialog from a widget listener handler
      if !message_box_open? && (!dialog_open? || queue&.dialog_ancestor == opened_dialogs.last) && ((!queue.nil? && async_exec_queues.keys.last == queue) || no_widget_handling_listener_work?)
        block = async_exec_queue(queue).pop
        block&.call
        Async::Task.new(delay: 1, &executer) if async_exec_queue(queue).any?
      else
        Async::Task.new(delay: 100, &executer)
      end
    end
    Async::Task.new(delay: 1, &executer)
  end
end