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



77
78
79
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 77

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)


40
41
42
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 40

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

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



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
74
75
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 44

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&.to_a.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