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, keyword, *args, &block) ⇒ Object

def add_content(parent, &content)

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


88
89
90
91
92
93
94
95
96
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 88

def add_content(parent, keyword, *args, &block)
  return unless parent.is_a?(Glimmer::UI::CustomWidget)
  # TODO consider avoiding source_location since it does not work in Opal
  if block.source_location && (block.source_location == parent.content&.__getobj__&.source_location)
    parent.content.call(parent) unless parent.content.called?
  else
    super
  end
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
76
77
78
79
80
81
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 44

def interpret(parent, keyword, *args, &block)
  begin
    require_path = LocalStorage[keyword]
    require(require_path) if require_path
  rescue => e
    Glimmer::Config.logger.debug e.message
  end
  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? || Glimmer::SWT::DisplayProxy.open_custom_shells_in_current_window?
      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