#!/usr/bin/env ruby
# wxRuby2 Sample Code. Copyright (c) 2004-2008 wxRuby development team
# Freely reusable code: see SAMPLES-LICENSE.TXT for details
begin
  require 'rubygems'
rescue LoadError
end
require 'wx'

class MyFrame < Wx::Frame
  def initialize(parent, id, log)
    super(parent, id, "Playing with menus", Wx::DEFAULT_POSITION, Wx::Size.new(400, 200))
    @log = log
    center_on_screen(Wx::BOTH)

    create_status_bar
    set_status_text("This is the statusbar")

    text = "A bunch of bogus menus have been created for this frame.  You can play around with them to see how they behave and then check the source for this sample to see how to implement them."
    tc = Wx::TextCtrl.new(self, -1, text, Wx::DEFAULT_POSITION,
                          Wx::DEFAULT_SIZE, Wx::TE_READONLY | Wx::TE_MULTILINE)

    # Prepare the menu bar
    menuBar = Wx::MenuBar.new

    # 1st menu from the left
    menu1 = Wx::Menu.new
    menu1.append(101, "&Mercury", "This the text in the Statusbar")
    menu1.append(102, "&Venus", "")
    menu1.append(103, "&Earth", "You may select Earth too")
    menu1.append_separator
    menu1.append(104, "&Close", "Close this frame")
    # Add menu to the menu bar
    menuBar.append(menu1, "&Planets")

    # 2nd menu from left
    menu2 = Wx::Menu.new
    menu2.append(201, "Hydrogen")
    menu2.append(202, "Helium")
    # a submenu in the 2nd menu
    submenu = Wx::Menu.new
    submenu.append(2031, "Lanthanium")
    submenu.append(2032, "Cerium")
    submenu.append(2033, "Praseodymium")
    item = Wx::MenuItem.new(menu2, 203, "Lanthanides", "", Wx::ITEM_NORMAL, submenu)
    menu2.append_item(item)
    # append 2nd menu
    menuBar.append(menu2, "&Elements")

    menu3 = Wx::Menu.new
    menu3.append_item(Wx::MenuItem.new(menu3, 301, "IRB", "a Ruby interactive shell", Wx::ITEM_RADIO))
    menu3.append_item(Wx::MenuItem.new(menu3, 302, "PyCrust", "a Python shell using wxPython as GUI", Wx::ITEM_RADIO))
    menu3.append_item(Wx::MenuItem.new(menu3, 303, "psi", "a simple Python shell using wxPython as GUI", Wx::ITEM_RADIO))
    menu3.append_separator
    menu3.append_item(Wx::MenuItem.new(menu3, 304, "project1", "", Wx::ITEM_NORMAL))
    menu3.append_item(Wx::MenuItem.new(menu3, 305, "project2", "", Wx::ITEM_NORMAL))
    menuBar.append(menu3, "&Shells")

    menu4 = Wx::Menu.new
    menu4.append_item(Wx::MenuItem.new(menu4, 401, "letters", "abcde...", Wx::ITEM_CHECK))
    menu4.append_item(Wx::MenuItem.new(menu4, 402, "digits", "123...", Wx::ITEM_CHECK))
    menu4.append_item(Wx::MenuItem.new(menu4, 403, "letters and digits", "abcd... + 123...", Wx::ITEM_CHECK))
    menuBar.append(menu4, "Chec&k")

    menu5 = Wx::Menu.new
    # Show how to put an icon in the menu
    item = Wx::MenuItem.new(menu5, 500, "&Smile!\tCtrl+S",
                            "This one has an icon")

    # set_bitmap is only available on Windows and GTK
    if item.respond_to?(:set_bitmap)
      bmp_file = File.join(File.dirname(__FILE__),
                           'icons', 'wxwin16x16.xpm')
      item.set_bitmap(Wx::Bitmap.new(bmp_file))
    end
    menu5.append_item(item)

    menu5.append(501, "Interesting thing\tCtrl+A", "Note the shortcut!")
    menu5.append_separator
    menu5.append(502, "Hello\tShift+H")
    menu5.append_separator
    menu5.append(503, "Remove the submenu")
    menu6 = Wx::Menu.new
    menu6.append(601, "Submenu Item")
    item = Wx::MenuItem.new(menu5, 504, "submenu", "", Wx::ITEM_NORMAL, menu6)
    menu5.append_item(item)
    menu5.append(505, "Remove this menuitem")
    menu5.append(506, "this is updated")
    menu5.append(507, "insert after this...")
    menu5.append(508, "...and before this")
    menuBar.append(menu5, "&Fun")

    set_menu_bar(menuBar)

    # Menu events
    evt_menu_highlight_all { |event| on_menu_highlight(event) }

    evt_menu(101) { |event| menu_101(event) }
    evt_menu(102) { |event| menu_102(event) }
    evt_menu(103) { |event| menu_103(event) }
    evt_menu(104) { |event| close_window(event) }

    evt_menu(201) { |event| menu_201(event) }
    evt_menu(202) { |event| menu_202(event) }
    evt_menu(2031) { |event| menu_2031(event) }
    evt_menu(2032) { |event| menu_2032(event) }
    evt_menu(2033) { |event| menu_2033(event) }

    evt_menu(301) { |event| menu_301_to_303(event) }
    evt_menu(302) { |event| menu_301_to_303(event) }
    evt_menu(303) { |event| menu_301_to_303(event) }
    evt_menu(304) { |event| menu_304(event) }
    evt_menu(305) { |event| menu_305(event) }

    evt_menu_range(401, 403) { |event| menu_401_to_403(event) }

    evt_menu(500) { |event| menu_500(event) }
    evt_menu(501) { |event| menu_501(event) }
    evt_menu(502) { |event| menu_502(event) }
    evt_menu(503) { |event| test_remove(event) }
    evt_menu(505) { |event| test_remove2(event) }
    evt_menu(507) { |event| test_insert(event) }
    evt_menu(508) { |event| test_insert(event) }

    evt_update_ui(506) { |event| test_update_ui(event) }
  end

  # Methods

  def on_menu_highlight(event)
    event.skip
  end

  def menu_101(event)
    @log.write_text("Welcome to Mercury")
  end

  def menu_102(event)
    @log.write_text("Welcome to Venus")
  end

  def menu_103(event)
    @log.write_text("Welcome to Earth")
  end

  def close_window(event)
    event.skip
  end

  def menu_201(event)
    @log.write_text("Chemical element number 1")
  end

  def menu_202(event)
    @log.write_text("Chemical element number 2")
  end

  def menu_2031(event)
    @log.write_text("Element number 57")
  end

  def menu_2032(event)
    @log.write_text("Element number 58")
  end

  def menu_2033(event)
    @log.write_text("Element number 59")
  end

  def menu_301_to_303(event)
    id = event.get_id
    @log.write_text("Event id: %d" % id)
  end

  def menu_304(event)
    @log.write_text("Not yet available")
  end

  def menu_305(event)
    @log.write_text("Still vapor")
  end

  def menu_401_to_403(event)
    @log.write_text("From an evt_menu_range event")
  end

  def menu_500(event)
    @log.write_text("Have a happy day!")
  end

  def menu_501(event)
    @log.write_text("Look in the code to see how the shortcut has been realized")
  end

  def menu_502(event)
    @log.write_text("Hello from Robert Carlin!")
  end

  # These methods haven't been implemented yet....Waiting for Wx::MenuBar.get_menu_bar to be implemented
  def test_remove(event)
    menubar = self.menu_bar
    menu = menubar.get_menu(menubar.find_menu("Fun"))

    unless menu
      @log.write_text("Cannot find menu 'Fun'!");
    else
      item_ix = menu.find_item('submenu')
      menu.destroy(item_ix) unless item_ix == Wx::NOT_FOUND
    end
  end

  def test_remove2(event)
    menubar = self.menu_bar
    menu = menubar.get_menu(menubar.find_menu("Fun"))

    unless menu
      @log.write_text("Cannot find menu 'Fun'!");
    else
      item = menu.find_item(505)
      menu.destroy(item) if item
    end
  end

  def test_insert(event) end

  def test_update_ui(event)
    event.skip
  end
end

module Demo
  def Demo.run(frame, nb, log)
    win = MyFrame.new(frame, -1, log)
    frame.otherWin = win
    win.show
  end

  def Demo.overview
    return "A demo of using Wx::MenuBar and Wx::Menu in various ways."
  end
end

if __FILE__ == $0
  run_solo_lib = File.join(File.dirname(__FILE__), 'run.rb')
  load run_solo_lib
  run File.basename($0)
end