Class: Glimmer::DSL::Opal::CustomWidgetExpression

Inherits:
Expression
  • Object
show all
Includes:
ParentExpression, TopLevelExpression
Defined in:
lib/glimmer/dsl/opal/custom_widget_expression.rb

Instance Method Summary collapse

Instance Method Details

#add_content(parent, &block) ⇒ Object



75
76
77
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 75

def add_content(parent, &content)
  content.call(parent) if parent.is_a?(Glimmer::SWT::ShellProxy) || parent.is_a?(Glimmer::UI::CustomShell)
end

#can_interpret?(parent, keyword, *args, &block) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 38

def can_interpret?(parent, keyword, *args, &block)
  !!UI::CustomWidget.for(keyword)
end

#interpret(parent, keyword, *args, &block) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 42

def interpret(parent, keyword, *args, &block)
  custom_widget_class = UI::CustomWidget.for(keyword)
  # TODO clean code by extracting methods into CustomShell
  if !Glimmer::UI::CustomShell.requested? && custom_widget_class.ancestors.include?(Glimmer::UI::CustomShell)
    if Glimmer::SWT::DisplayProxy.instance.shells.empty?
      custom_widget_class.new(parent, *args, {}, &block)
    else
      options = args.last.is_a?(Hash) ? args.pop : {}
      options = options.merge('swt_style' => args.join(',')) unless args.join(',').empty?
      params = {
        'custom_shell' => keyword
      }.merge(options)
      param_string = params.to_a.map {|k, v| "#{k}=#{URI.encode_www_form_component(v)}"}.join('&')
      url = "#{`document.location.href`}?#{param_string}"            
      `window.open(#{url})`
       # just a placeholder that has an open method # TODO return an actual CustomShell in the future that does the work happening above in the #open method
      Glimmer::SWT::MakeShiftShellProxy.new
    end
  else
    if Glimmer::UI::CustomShell.requested_and_not_handled?
      parameters = Glimmer::UI::CustomShell.request_parameter_string.split("&").map {|str| str.split("=")}.to_h
      `history.pushState(#{parameters.merge('custom_shell_handled' => 'true')}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string}&custom_shell_handled=true"})`
      custom_shell_keyword = parameters.delete('custom_shell')
      CustomWidgetExpression.new.interpret(nil, custom_shell_keyword, *[parameters])
      `history.pushState(#{parameters.reject {|k,v| k == 'custom_shell_handled'}}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string.sub('&custom_shell_handled=true', '')}"})`
      # just a placeholder that has an open method # TODO return an actual CustomShell in the future that does the work happening above in the #open method            
      Glimmer::SWT::MakeShiftShellProxy.new
    else
      custom_widget_class&.new(parent, *args, {}, &block)
    end
  end
end