# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
# $Id: menus.rb,v 1.4 2005/02/12 23:02:43 kzys Exp $
=begin
= Menus

There are several widgets involved in displaying menus. The
Gtk::MenuBar widget is a horizontal menu bar, which normally appears
at the top of an application. The Gtk::Menu widget is the actual menu
that pops up. Both Gtk::MenuBar and Gtk::Menu are subclasses of
Gtk::MenuShell; a Gtk::MenuShell contains menu items
(Gtk::MenuItem). Each menu item contains text and/or images and can
be selected by the user.

There are several kinds of menu item, including plain Gtk::MenuItem,
Gtk::CheckMenuItem which can be checked/unchecked, Gtk::RadioMenuItem
which is a check menu item that's in a mutually exclusive group,
Gtk::SeparatorMenuItem which is a separator bar, Gtk::TearoffMenuItem
which allows a Gtk::Menu to be torn off, and Gtk::ImageMenuItem which
can place a Gtk::Image or other widget next to the menu text.

A Gtk::MenuItem can have a submenu, which is simply a Gtk::Menu to pop
up when the menu item is selected. Typically, all menu items in a menu bar
have submenus.

The Gtk::OptionMenu widget is a button that pops up a Gtk::Menu when clicked.
It's used inside dialogs and such.

Gtk::ItemFactory provides a higher-level interface for creating menu bars
and menus; while you can construct menus manually, most people don't
do that. There's a separate demo for Gtk::ItemFactory.
=end
require 'common'

module Demo
  class Menus < BasicWindow
    def initialize
      super('menus')
      self.border_width = 0

      accel_group = Gtk::AccelGroup.new
      add_accel_group(accel_group)


      box1 = Gtk::VBox.new(false, 0)
      add(box1)

      menubar = Gtk::MenuBar.new
      box1.pack_start(menubar, :expand => false, :fill => true, :padding => 0)

      menu = create_menu(2, true)

      menuitem = Gtk::MenuItem.new("test\nline2")
      menuitem.submenu = menu
      menubar.append(menuitem)
      menuitem.show

      menuitem = Gtk::MenuItem.new('foo')
      menuitem.submenu = create_menu(3, true)
      menubar.append(menuitem)
      menuitem.show

      menuitem = Gtk::MenuItem.new('bar')
      menuitem.submenu = create_menu(4, true)
      menuitem.right_justified = true
      menubar.append(menuitem)
      menuitem.show

      box2 = Gtk::VBox.new(false, 10)
      box2.border_width = 10
      box1.pack_start(box2, :expand => true, :fill => true, :padding => 0)
      box2.show

      menu = create_menu(1, false)
      # menu.accel_group = accel_group

      menuitem = Gtk::SeparatorMenuItem.new
      menu.append(menuitem)
      menuitem.show

      menuitem = Gtk::CheckMenuItem.new('Accelerate Me')
      menu.append(menuitem)
      menuitem.show
      menuitem.add_accelerator('activate',
                               accel_group,
                               Gdk::Keyval::GDK_F1,
                               0,
                               Gtk::ACCEL_VISIBLE)
      menuitem = Gtk::CheckMenuItem.new('Accelerator Locked')
      menu.append(menuitem)
      menuitem.show
      menuitem.add_accelerator('activate',
                               accel_group,
                               Gdk::Keyval::GDK_F2,
                               0,
                               Gtk::ACCEL_VISIBLE | Gtk::ACCEL_LOCKED)
      menuitem = Gtk::CheckMenuItem.new('Accelerators Frozen')
      menu.append(menuitem)
      menuitem.show
      menuitem.add_accelerator('activate',
                               accel_group,
                               Gdk::Keyval::GDK_F2,
                               0,
                               Gtk::ACCEL_VISIBLE)
      menuitem.add_accelerator('activate',
                               accel_group,
                               Gdk::Keyval::GDK_F3,
                               0,
                               Gtk::ACCEL_VISIBLE)

      optionmenu = Gtk::OptionMenu.new
      optionmenu.menu = menu
      optionmenu.history = 3
      box2.pack_start(optionmenu, :expand => true, :fill => true, :padding => 0)
      optionmenu.show

      separator = Gtk::HSeparator.new
      box1.pack_start(separator, :expand => false, :fill => true, :padding => 0)
      separator.show

      box2 = Gtk::VBox.new(false, 10)
      box2.border_width = 10
      box1.pack_start(box2, :expand => false, :fill => true, :padding => 0)
      box2.show

      button = Gtk::Button.new('close')
      button.signal_connect('clicked') do
        quit
      end
      box2.pack_start(button, :expand => true, :fill => true, :padding => 0)
      button.flags = Gtk::Widget::CAN_DEFAULT
      button.grab_default
      button.show
    end


    def create_menu (depth, tearoff)
      if depth < 1
        return nil
      end

      menu = Gtk::Menu.new
      group = nil

      if tearoff
        menuitem = Gtk::TearoffMenuItem.new
        menu.append(menuitem)
        menuitem.show
      end

      5.times do |i|
        buf = sprintf('item %2d - %d', depth, i + 1)
        menuitem = Gtk::RadioMenuItem.new(buf)
        group = menuitem.group

        menu.append(menuitem)
        menuitem.show
        if i == 3
          menuitem.sensitive = false
        end

        if submenu = create_menu(depth - 1, true)
          menuitem.submenu = submenu
        end
      end

      menu.show
      return menu
    end
  end
end
