In Files

  • json/lib/json/editor.rb

JSON::Editor::PopUpMenu

This class creates the popup menu, that opens when clicking onto the treeview.

Public Instance Methods

append_new_node(item) click to toggle source

Append a new node to the selected Hash or Array.

 
               # File json/lib/json/editor.rb, line 388
def append_new_node(item)
  if parent = selection.selected
    parent_type = parent.type
    case parent_type
    when 'Hash'
      key, type, content = ask_for_hash_pair(parent)
      key or return
      iter = create_node(parent, 'Key', key)
      iter = create_node(iter, type, content)
      toplevel.display_status(
        "Added a (key, value)-pair to '#{parent_type}'.")
      window.change
    when 'Array'
      type, content = ask_for_element(parent)
      type or return
      iter = create_node(parent, type, content)
      window.change
      toplevel.display_status("Appendend an element to '#{parent_type}'.")
    else
      toplevel.display_status("Cannot append to '#{parent_type}'!")
    end
  else
    type, content = ask_for_element
    type or return
    iter = create_node(nil, type, content)
    window.change
  end
end
            
change_node(item) click to toggle source

Change the type or content of the selected node.

 
               # File json/lib/json/editor.rb, line 265
def change_node(item)
  if current = selection.selected
    parent = current.parent
    old_type, old_content = current.type, current.content
    if ALL_TYPES.include?(old_type)
      @clipboard_data = Editor.model2data(current)
      type, content = ask_for_element(parent, current.type,
        current.content)
      if type
        current.type, current.content = type, content
        current.remove_subtree(model)
        toplevel.display_status("Changed a node in tree.")
        window.change
      end
    else
      toplevel.display_status(
        "Cannot change node of type #{old_type} in tree!")
    end
  end
end
            
collapse_expand(item) click to toggle source

Recursively collapse/expand a subtree starting from the selected node.

 
               # File json/lib/json/editor.rb, line 444
def collapse_expand(item)
  if current = selection.selected
    if row_expanded?(current.path)
      collapse_row(current.path)
    else
      expand_row(current.path, true)
    end
  else
      toplevel.display_status("Append a node into the root first!")
  end
end
            
copy_node(item) click to toggle source

Copy the selected node and its subtree, and save it into the clipboard.

 
               # File json/lib/json/editor.rb, line 305
def copy_node(item)
  if current = selection.selected
    if current and current.type == 'Key'
      @clipboard_data = {
        current.content => Editor.model2data(current.first_child)
      }
    else
      @clipboard_data = Editor.model2data(current)
    end
    window.change
    toplevel.display_status("Copied a node from tree.")
  end
end
            
create() click to toggle source

Create the menu.

 
               # File json/lib/json/editor.rb, line 457
def create
  add_item("Change node", ?n, &method(:change_node))
  add_separator
  add_item("Cut node", ?X, &method(:cut_node))
  add_item("Copy node", ?C, &method(:copy_node))
  add_item("Paste node (appending)", ?A, &method(:paste_node_appending))
  add_item("Paste node (inserting before)", ?I,
    &method(:paste_node_inserting_before))
  add_separator
  add_item("Append new node", ?a, &method(:append_new_node))
  add_item("Insert new node before", ?i, &method(:insert_new_node))
  add_separator 
  add_item("Collapse/Expand node (recursively)", ?e,
    &method(:collapse_expand))

  menu.show_all
  signal_connect(:button_press_event) do |widget, event|
    if event.kind_of? Gdk::EventButton and event.button == 3
      menu.popup(nil, nil, event.button, event.time)
    end
  end
  signal_connect(:popup_menu) do
    menu.popup(nil, nil, 0, Gdk::Event::CURRENT_TIME)
  end
end
            
cut_node(item) click to toggle source

Cut the selected node and its subtree, and save it into the clipboard.

 
               # File json/lib/json/editor.rb, line 288
def cut_node(item)
  if current = selection.selected
    if current and current.type == 'Key'
      @clipboard_data = {
        current.content => Editor.model2data(current.first_child)
      }
    else
      @clipboard_data = Editor.model2data(current)
    end
    model.remove(current)
    window.change
    toplevel.display_status("Cut a node from tree.")
  end
end
            
insert_new_node(item) click to toggle source

Insert a new node into an Array before the selected element.

 
               # File json/lib/json/editor.rb, line 418
def insert_new_node(item)
  if current = selection.selected
    parent = current.parent or return
    parent_parent = parent.parent
    parent_type = parent.type
    if parent_type == 'Array'
      selected_index = parent.each_with_index do |c, i|
        break i if c == current
      end
      type, content = ask_for_element(parent)
      type or return
      iter = model.insert_before(parent, current)
      iter.type, iter.content = type, content
      toplevel.display_status("Inserted an element to " +
        "'#{parent_type}' before index #{selected_index}.")
      window.change
    else
      toplevel.display_status(
        "Cannot insert node below '#{parent_type}'!")
    end
  else
      toplevel.display_status("Append a node into the root first!")
  end
end
            
paste_node_appending(item) click to toggle source

Paste the data in the clipboard into the selected Array or Hash by appending it.

 
               # File json/lib/json/editor.rb, line 321
def paste_node_appending(item)
  if current = selection.selected
    if @clipboard_data
      case current.type
      when 'Array'
        Editor.data2model(@clipboard_data, model, current)
        expand_collapse(current)
      when 'Hash'
        if @clipboard_data.is_a? Hash
          parent = current.parent
          hash = Editor.model2data(current)
          model.remove(current)
          hash.update(@clipboard_data)
          Editor.data2model(hash, model, parent)
          if parent
            expand_collapse(parent)
          elsif @expanded
            expand_all
          end
          window.change
        else
          toplevel.display_status(
            "Cannot paste non-#{current.type} data into '#{current.type}'!")
        end
      else
        toplevel.display_status(
          "Cannot paste node below '#{current.type}'!")
      end
    else
      toplevel.display_status("Nothing to paste in clipboard!")
    end
  else
      toplevel.display_status("Append a node into the root first!")
  end
end
            
paste_node_inserting_before(item) click to toggle source

Paste the data in the clipboard into the selected Array inserting it before the selected element.

 
               # File json/lib/json/editor.rb, line 359
def paste_node_inserting_before(item)
  if current = selection.selected
    if @clipboard_data
      parent = current.parent or return
      parent_type = parent.type
      if parent_type == 'Array'
        selected_index = parent.each_with_index do |c, i|
          break i if c == current
        end
        Editor.data2model(@clipboard_data, model, parent) do |m|
          m.insert_before(parent, current)
        end
        expand_collapse(current)
        toplevel.display_status("Inserted an element to " +
          "'#{parent_type}' before index #{selected_index}.")
        window.change
      else
        toplevel.display_status(
          "Cannot insert node below '#{parent_type}'!")
      end
    else
      toplevel.display_status("Nothing to paste in clipboard!")
    end
  else
      toplevel.display_status("Append a node into the root first!")
  end
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus