menubar.rb   [plain text]


#
# tk/menubar.rb
#
# Original version:
#   Copyright (C) 1998 maeda shugo. All rights reserved. 
#   This file can be distributed under the terms of the Ruby.

# Usage:
#
# menu_spec = [
#   [['File', 0],
#     ['Open', proc{puts('Open clicked')}, 0],
#     '---',
#     ['Quit', proc{exit}, 0]],
#   [['Edit', 0],
#     ['Cut', proc{puts('Cut clicked')}, 2],
#     ['Copy', proc{puts('Copy clicked')}, 0],
#     ['Paste', proc{puts('Paste clicked')}, 0]]
# ]
# menubar = TkMenubar.new(nil, menu_spec,
#                       'tearoff'=>false,
#                       'foreground'=>'grey40',
#                       'activeforeground'=>'red',
#                       'font'=>'-adobe-helvetica-bold-r-*--12-*-iso8859-1')
# menubar.pack('side'=>'top', 'fill'=>'x')
#
#
# OR
#
#
# menubar = TkMenubar.new
# menubar.add_menu([['File', 0],
#                  ['Open', proc{puts('Open clicked')}, 0],
#                  '---',
#                  ['Quit', proc{exit}, 0]])
# menubar.add_menu([['Edit', 0],
#                  ['Cut', proc{puts('Cut clicked')}, 2],
#                  ['Copy', proc{puts('Copy clicked')}, 0],
#                  ['Paste', proc{puts('Paste clicked')}, 0]])
# menubar.configure('tearoff', false)
# menubar.configure('foreground', 'grey40')
# menubar.configure('activeforeground', 'red')
# menubar.configure('font', '-adobe-helvetica-bold-r-*--12-*-iso8859-1')
# menubar.pack('side'=>'top', 'fill'=>'x')
#
#
# OR
#
# radio_var = TkVariable.new('y')
# menu_spec = [
#   [['File', 0],
#     {:label=>'Open', :command=>proc{puts('Open clicked')}, :underline=>0},
#     '---',
#     ['Check_A', TkVariable.new(true), 6],
#     {:type=>'checkbutton', :label=>'Check_B', 
#                 :variable=>TkVariable.new, :underline=>6},
#     '---',
#     ['Radio_X', [radio_var, 'x'], 6],
#     ['Radio_Y', [radio_var, 'y'], 6],
#     ['Radio_Z', [radio_var, 'z'], 6],
#     '---',
#     ['cascade', [ 
#                    ['sss', proc{p 'sss'}, 0], 
#                    ['ttt', proc{p 'ttt'}, 0], 
#                    ['uuu', proc{p 'uuu'}, 0], 
#                    ['vvv', proc{p 'vvv'}, 0], 
#                 ], 0],
#     '---',
#     ['Quit', proc{exit}, 0]],
#   [['Edit', 0],
#     ['Cut', proc{puts('Cut clicked')}, 2],
#     ['Copy', proc{puts('Copy clicked')}, 0],
#     ['Paste', proc{puts('Paste clicked')}, 0]]
# ]
# menubar = TkMenubar.new(nil, menu_spec,
#                        'tearoff'=>false,
#                        'foreground'=>'grey40',
#                        'activeforeground'=>'red',
#                        'font'=>'Helvetia 12 bold')
# menubar.pack('side'=>'top', 'fill'=>'x')

# See tk/menuspce.rb about the format of the menu_spec

# To use add_menu, configuration must be done by calling configure after
# adding all menus by add_menu, not by the constructor arguments.

require 'tk'
require 'tk/frame'
require 'tk/composite'
require 'tk/menuspec'

class TkMenubar<TkFrame
  include TkComposite
  include TkMenuSpec
  
  def initialize(parent = nil, spec = nil, options = nil)
    if parent.kind_of? Hash
      options = _symbolkey2str(parent)
      spec = options.delete('spec')
      super(options)
    else
      super(parent, options)
    end

    @menus = []
    
    spec.each{|info| add_menu(info)} if spec

    options.each{|key, value| configure(key, value)} if options
  end

  def add_menu(menu_info)
    mbtn, menu = _create_menubutton(@frame, menu_info)

    submenus = _get_cascade_menus(menu).flatten

    @menus.push([mbtn, menu])
    delegate('tearoff', menu, *submenus)
    delegate('foreground', mbtn, menu, *submenus)
    delegate('background', mbtn, menu, *submenus)
    delegate('disabledforeground', mbtn, menu, *submenus)
    delegate('activeforeground', mbtn, menu, *submenus)
    delegate('activebackground', mbtn, menu, *submenus)
    delegate('font', mbtn, menu, *submenus)
    delegate('kanjifont', mbtn, menu, *submenus)
  end
  
  def [](index)
    return @menus[index]
  end
end