Class JSON::Editor::PopUpMenu
In: lib/json/editor.rb
Parent: Object
StringScanner Parser JSONTreeView MainWindow Gtk::TreeView OptionsMenu EditMenu PopUpMenu FileMenu Gtk::Window Enumerable TreeIter Gtk State lib/json.rb lib/json/editor.rb MenuExtension lib/json/editor.rb Gtk Editor JSON dot/m_1_0.png

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

Methods

Included Modules

MenuExtension

Public Instance methods

Append a new node to the selected Hash or Array.

[Source]

     # File lib/json/editor.rb, line 357
357:       def append_new_node(item)
358:         if parent = selection.selected
359:           parent_type = parent.type
360:           case parent_type
361:           when 'Hash'
362:             key, type, content = ask_for_hash_pair(parent)
363:             key or return
364:             iter = create_node(parent, 'Key', key)
365:             iter = create_node(iter, type, content)
366:             toplevel.display_status(
367:               "Added a (key, value)-pair to '#{parent_type}'.")
368:             window.change
369:           when 'Array'
370:             type, content = ask_for_element(parent)
371:             type or return
372:             iter = create_node(parent, type, content)
373:             window.change
374:             toplevel.display_status("Appendend an element to '#{parent_type}'.")
375:           else
376:             toplevel.display_status("Cannot append to '#{parent_type}'!")
377:           end
378:         else
379:           type, content = ask_for_element
380:           type or return
381:           iter = create_node(nil, type, content)
382:           window.change
383:         end
384:       end

Change the type or content of the selected node.

[Source]

     # File lib/json/editor.rb, line 234
234:       def change_node(item)
235:         if current = selection.selected
236:           parent = current.parent
237:           old_type, old_content = current.type, current.content
238:           if ALL_TYPES.include?(old_type)
239:             @clipboard_data = Editor.model2data(current)
240:             type, content = ask_for_element(parent, current.type,
241:               current.content)
242:             if type
243:               current.type, current.content = type, content
244:               current.remove_subtree(model)
245:               toplevel.display_status("Changed a node in tree.")
246:               window.change
247:             end
248:           else
249:             toplevel.display_status(
250:               "Cannot change node of type #{old_type} in tree!")
251:           end
252:         end
253:       end

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

[Source]

     # File lib/json/editor.rb, line 413
413:       def collapse_expand(item)
414:         if current = selection.selected
415:           if row_expanded?(current.path)
416:             collapse_row(current.path)
417:           else
418:             expand_row(current.path, true)
419:           end
420:         else
421:             toplevel.display_status("Append a node into the root first!")
422:         end
423:       end

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

[Source]

     # File lib/json/editor.rb, line 274
274:       def copy_node(item)
275:         if current = selection.selected
276:           if current and current.type == 'Key'
277:             @clipboard_data = {
278:               current.content => Editor.model2data(current.first_child)
279:             }
280:           else
281:             @clipboard_data = Editor.model2data(current)
282:           end
283:           window.change
284:           toplevel.display_status("Copied a node from tree.")
285:         end
286:       end

Create the menu.

[Source]

     # File lib/json/editor.rb, line 426
426:       def create
427:         add_item("Change node", &method(:change_node))
428:         add_separator
429:         add_item("Cut node", &method(:cut_node))
430:         add_item("Copy node", &method(:copy_node))
431:         add_item("Paste node (appending)", &method(:paste_node_appending))
432:         add_item("Paste node (inserting before)",
433:           &method(:paste_node_inserting_before))
434:         add_separator
435:         add_item("Append new node", &method(:append_new_node))
436:         add_item("Insert new node before", &method(:insert_new_node))
437:         add_separator 
438:         add_item("Collapse/Expand node (recursively)",
439:           &method(:collapse_expand))
440: 
441:         menu.show_all
442:         signal_connect(:button_press_event) do |widget, event|
443:           if event.kind_of? Gdk::EventButton and event.button == 3
444:             menu.popup(nil, nil, event.button, event.time)
445:           end
446:         end
447:         signal_connect(:popup_menu) do
448:           menu.popup(nil, nil, 0, Gdk::Event::CURRENT_TIME)
449:         end
450:       end

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

[Source]

     # File lib/json/editor.rb, line 257
257:       def cut_node(item)
258:         if current = selection.selected
259:           if current and current.type == 'Key'
260:             @clipboard_data = {
261:               current.content => Editor.model2data(current.first_child)
262:             }
263:           else
264:             @clipboard_data = Editor.model2data(current)
265:           end
266:           model.remove(current)
267:           window.change
268:           toplevel.display_status("Cut a node from tree.")
269:         end
270:       end

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

[Source]

     # File lib/json/editor.rb, line 387
387:       def insert_new_node(item)
388:         if current = selection.selected
389:           parent = current.parent or return
390:           parent_parent = parent.parent
391:           parent_type = parent.type
392:           if parent_type == 'Array'
393:             selected_index = parent.each_with_index do |c, i|
394:               break i if c == current
395:             end
396:             type, content = ask_for_element(parent)
397:             type or return
398:             iter = model.insert_before(parent, current)
399:             iter.type, iter.content = type, content
400:             toplevel.display_status("Inserted an element to " +
401:               "'#{parent_type}' before index #{selected_index}.")
402:             window.change
403:           else
404:             toplevel.display_status(
405:               "Cannot insert node below '#{parent_type}'!")
406:           end
407:         else
408:             toplevel.display_status("Append a node into the root first!")
409:         end
410:       end

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

[Source]

     # File lib/json/editor.rb, line 290
290:       def paste_node_appending(item)
291:         if current = selection.selected
292:           if @clipboard_data
293:             case current.type
294:             when 'Array'
295:               Editor.data2model(@clipboard_data, model, current)
296:               expand_collapse(current)
297:             when 'Hash'
298:               if @clipboard_data.is_a? Hash
299:                 parent = current.parent
300:                 hash = Editor.model2data(current)
301:                 model.remove(current)
302:                 hash.update(@clipboard_data)
303:                 Editor.data2model(hash, model, parent)
304:                 if parent
305:                   expand_collapse(parent)
306:                 elsif @expanded
307:                   expand_all
308:                 end
309:                 window.change
310:               else
311:                 toplevel.display_status(
312:                   "Cannot paste non-#{current.type} data into '#{current.type}'!")
313:               end
314:             else
315:               toplevel.display_status(
316:                 "Cannot paste node below '#{current.type}'!")
317:             end
318:           else
319:             toplevel.display_status("Nothing to paste in clipboard!")
320:           end
321:         else
322:             toplevel.display_status("Append a node into the root first!")
323:         end
324:       end

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

[Source]

     # File lib/json/editor.rb, line 328
328:       def paste_node_inserting_before(item)
329:         if current = selection.selected
330:           if @clipboard_data
331:             parent = current.parent or return
332:             parent_type = parent.type
333:             if parent_type == 'Array'
334:               selected_index = parent.each_with_index do |c, i|
335:                 break i if c == current
336:               end
337:               Editor.data2model(@clipboard_data, model, parent) do |m|
338:                 m.insert_before(parent, current)
339:               end
340:               expand_collapse(current)
341:               toplevel.display_status("Inserted an element to " +
342:                 "'#{parent_type}' before index #{selected_index}.")
343:               window.change
344:             else
345:               toplevel.display_status(
346:                 "Cannot insert node below '#{parent_type}'!")
347:             end
348:           else
349:             toplevel.display_status("Nothing to paste in clipboard!")
350:           end
351:         else
352:             toplevel.display_status("Append a node into the root first!")
353:         end
354:       end

[Validate]