File: tk/toplevel.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Tk
  class: Toplevel#8
includes
  TkMenuSpec   
  Wm ( Tk )
inherits from
  TkWindow   
has properties
constant: TkCommandNames #12
constant: WidgetClassName #13
method: __boolval_optkeys #48
method: __strval_optkeys #53
method: __val2ruby_optkeys #58
method: __methodcall_optkeys #63
method: _wm_command_option_chk / 1 #68
method: initialize / 4 #98
method: specific_class #197
method: add_menu / 3 #201
method: add_menubar / 3 #212
class method: database_class #220
class method: database_classname #227
class method: bind / 2 #231
class method: bind_append / 2 #238
class method: bind_remove / 1 #245
class method: bindinfo / 1 #252

Class Hierarchy

Object ( Builtin-Module )
TkKernel
TkObject
TkWindow
  Toplevel ( Tk ) #8

Code

   1  #
   2  # tk/toplevel.rb : treat toplevel widget
   3  #
   4  require 'tk'
   5  require 'tk/wm'
   6  require 'tk/menuspec'
   7 
   8  class Tk::Toplevel<TkWindow
   9    include Wm
  10    include TkMenuSpec
  11 
  12    TkCommandNames = ['toplevel'.freeze].freeze
  13    WidgetClassName = 'Toplevel'.freeze
  14    WidgetClassNames[WidgetClassName] = self
  15 
  16  ################# old version
  17  #  def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
  18  #    if screen.kind_of? Hash
  19  #      keys = screen.dup
  20  #    else
  21  #      @screen = screen
  22  #    end
  23  #    @classname = classname
  24  #    if keys.kind_of? Hash
  25  #      keys = keys.dup
  26  #      @classname = keys.delete('classname') if keys.key?('classname')
  27  #      @colormap  = keys.delete('colormap')  if keys.key?('colormap')
  28  #      @container = keys.delete('container') if keys.key?('container')
  29  #      @screen    = keys.delete('screen')    if keys.key?('screen')
  30  #      @use       = keys.delete('use')       if keys.key?('use')
  31  #      @visual    = keys.delete('visual')    if keys.key?('visual')
  32  #    end
  33  #    super(parent, keys)
  34  #  end
  35  #
  36  #  def create_self
  37  #    s = []
  38  #    s << "-class"     << @classname if @classname
  39  #    s << "-colormap"  << @colormap  if @colormap
  40  #    s << "-container" << @container if @container
  41  #    s << "-screen"    << @screen    if @screen 
  42  #    s << "-use"       << @use       if @use
  43  #    s << "-visual"    << @visual    if @visual
  44  #    tk_call 'toplevel', @path, *s
  45  #  end
  46  #################
  47 
  48    def __boolval_optkeys
  49      super() << 'container'
  50    end
  51    private :__boolval_optkeys
  52 
  53    def __strval_optkeys
  54      super() << 'screen'
  55    end
  56    private :__strval_optkeys
  57 
  58    def __val2ruby_optkeys  # { key=>proc, ... }
  59      super().update('menu'=>proc{|v| window(v)})
  60    end
  61    private :__val2ruby_optkeys
  62 
  63    def __methodcall_optkeys  # { key=>method, ... }
  64      TOPLEVEL_METHODCALL_OPTKEYS
  65    end
  66    private :__methodcall_optkeys
  67 
  68    def _wm_command_option_chk(keys)
  69      keys = {} unless keys
  70      new_keys = {}
  71      wm_cmds = {}
  72 
  73      conf_methods = _symbolkey2str(__methodcall_optkeys())
  74 
  75      keys.each{|k,v| # k is a String
  76        if conf_methods.key?(k)
  77          wm_cmds[conf_methods[k]] = v
  78        elsif Wm.method_defined?(k)
  79          case k
  80          when 'screen','class','colormap','container','use','visual'
  81            new_keys[k] = v
  82          else
  83            case self.method(k).arity
  84            when -1,1
  85              wm_cmds[k] = v
  86            else
  87              new_keys[k] = v
  88            end
  89          end
  90        else
  91          new_keys[k] = v
  92        end
  93      }
  94      [new_keys, wm_cmds]
  95    end
  96    private :_wm_command_option_chk
  97 
  98    def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
  99      my_class_name = nil
 100      if self.class < WidgetClassNames[WidgetClassName]
 101        my_class_name = self.class.name
 102        my_class_name = nil if my_class_name == ''
 103      end
 104      if parent.kind_of? Hash
 105        keys = _symbolkey2str(parent)
 106        if keys.key?('classname')
 107          keys['class'] = keys.delete('classname')
 108        end
 109        @classname = keys['class']
 110        @colormap  = keys['colormap']
 111        @container = keys['container']
 112        @screen    = keys['screen']
 113        @use       = keys['use']
 114        @visual    = keys['visual']
 115        if !@classname && my_class_name
 116          keys['class'] = @classname = my_class_name 
 117        end
 118        if @classname.kind_of? TkBindTag
 119          @db_class = @classname
 120          keys['class'] = @classname = @classname.id
 121        elsif @classname
 122          @db_class = TkDatabaseClass.new(@classname)
 123          keys['class'] = @classname
 124        else
 125          @db_class = self.class
 126          @classname = @db_class::WidgetClassName
 127        end
 128        keys, cmds = _wm_command_option_chk(keys)
 129        super(keys)
 130        cmds.each{|k,v| 
 131          if v.kind_of? Array
 132            self.__send__(k,*v)
 133          else
 134            self.__send__(k,v)
 135          end
 136        }
 137        return
 138      end
 139 
 140      if screen.kind_of? Hash
 141        keys = screen
 142      else
 143        @screen = screen
 144        if classname.kind_of? Hash
 145          keys = classname
 146        else
 147          @classname = classname
 148        end
 149      end
 150      if keys.kind_of? Hash
 151        keys = _symbolkey2str(keys)
 152        if keys.key?('classname')
 153          keys['class'] = keys.delete('classname')
 154        end
 155        @classname = keys['class']  unless @classname
 156        @colormap  = keys['colormap']
 157        @container = keys['container']
 158        @screen    = keys['screen'] unless @screen
 159        @use       = keys['use']
 160        @visual    = keys['visual']
 161      else
 162        keys = {}
 163      end
 164      if !@classname && my_class_name
 165        keys['class'] = @classname = my_class_name 
 166      end
 167      if @classname.kind_of? TkBindTag
 168        @db_class = @classname
 169        keys['class'] = @classname = @classname.id
 170      elsif @classname
 171        @db_class = TkDatabaseClass.new(@classname)
 172        keys['class'] = @classname
 173      else
 174        @db_class = self.class
 175        @classname = @db_class::WidgetClassName
 176      end
 177      keys, cmds = _wm_command_option_chk(keys)
 178      super(parent, keys)
 179      cmds.each{|k,v| 
 180        if v.kind_of? Array
 181          self.send(k,*v)
 182        else
 183          self.send(k,v)
 184        end
 185      }
 186    end
 187 
 188    #def create_self(keys)
 189    #  if keys and keys != None
 190    #    tk_call_without_enc('toplevel', @path, *hash_kv(keys, true))
 191    #  else
 192    #    tk_call_without_enc('toplevel', @path)
 193    #  end
 194    #end
 195    #private :create_self
 196 
 197    def specific_class
 198      @classname
 199    end
 200 
 201    def add_menu(menu_info, tearoff=false, opts=nil)
 202      # See tk/menuspec.rb for menu_info.
 203      # opts is a hash of default configs for all of cascade menus. 
 204      # Configs of menu_info can override it. 
 205      if tearoff.kind_of?(Hash)
 206        opts = tearoff
 207        tearoff = false
 208      end
 209      _create_menubutton(self, menu_info, tearoff, opts)
 210    end
 211 
 212    def add_menubar(menu_spec, tearoff=false, opts=nil)
 213      # See tk/menuspec.rb for menu_spec.
 214      # opts is a hash of default configs for all of cascade menus.
 215      # Configs of menu_spec can override it. 
 216      menu_spec.each{|info| add_menu(info, tearoff, opts)}
 217      self.menu
 218    end
 219 
 220    def self.database_class
 221      if self == WidgetClassNames[WidgetClassName] || self.name == ''
 222        self
 223      else
 224        TkDatabaseClass.new(self.name)
 225      end
 226    end
 227    def self.database_classname
 228      self.database_class.name
 229    end
 230 
 231    def self.bind(*args, &b)
 232      if self == WidgetClassNames[WidgetClassName] || self.name == ''
 233        super(*args, &b)
 234      else
 235        TkDatabaseClass.new(self.name).bind(*args, &b)
 236      end
 237    end
 238    def self.bind_append(*args, &b)
 239      if self == WidgetClassNames[WidgetClassName] || self.name == ''
 240        super(*args, &b)
 241      else
 242        TkDatabaseClass.new(self.name).bind_append(*args, &b)
 243      end
 244    end
 245    def self.bind_remove(*args)
 246      if self == WidgetClassNames[WidgetClassName] || self.name == ''
 247        super(*args)
 248      else
 249        TkDatabaseClass.new(self.name).bind_remove(*args)
 250      end
 251    end
 252    def self.bindinfo(*args)
 253      if self == WidgetClassNames[WidgetClassName] || self.name == ''
 254        super(*args)
 255      else
 256        TkDatabaseClass.new(self.name).bindinfo(*args)
 257      end
 258    end
 259  end
 260 
 261  #TkToplevel = Tk::Toplevel unless Object.const_defined? :TkToplevel
 262  Tk.__set_toplevel_aliases__(:Tk, Tk::Toplevel, :TkToplevel)