summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/blt/tabnotebook.rb
blob: 510352ba48525b8d4fc55f54c34887d8034bc515 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#
#  tkextlib/blt/tabnotebook.rb
#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#

require 'tk'
require 'tkextlib/blt.rb'
require 'tkextlib/blt/tabset.rb'

module Tk::BLT
  class Tabnotebook < Tabset
    TkCommandNames = ['::blt::tabnotebook'.freeze].freeze
    WidgetClassName = 'Tabnotebook'.freeze
    WidgetClassNames[WidgetClassName] = self

    class Tab < Tk::BLT::Tabset::Tab
      def self.new(parent, pos=nil, name=nil, keys={})
        if pos.kind_of?(Hash)
          keys = pos
          name = nil
          pos  = nil
        end
        if name.kind_of?(Hash)
          keys = name
          name = nil
        end
        obj = nil
        TabID_TBL.mutex.synchronize{
          if name && TabID_TBL[parent.path] && TabID_TBL[parent.path][name]
            obj = TabID_TBL[parent.path][name]
            if pos
              if pos.to_s == 'end'
                obj.move_after('end')
              else
                obj.move_before(pos)
              end
            end
            obj.configure if keys && ! keys.empty?
          else
            (obj = self.allocate).instance_eval{
              initialize(parent, pos, name, keys)
              TabID_TBL[@tpath] = {} unless TabID_TBL[@tpath]
              TabID_TBL[@tpath][@id] = self
            }
          end
        }
        obj
      end

      def initialize(parent, pos, name, keys)
        @t = parent
        @tpath = parent.path
        if name
          @path = @id = name
          unless (list(tk_call(@tpath, 'tab', 'names', @id)).empty?)
            if pos
              idx = tk_call(@tpath, 'index', @id)
              if pos.to_s == 'end'
                tk_call(@tpath, 'move', idx, 'after', 'end')
              else
                tk_call(@tpath, 'move', idx, 'before', pos)
              end
            end
            tk_call(@tpath, 'tab', 'configure', @id, keys)
          else
            fail ArgumentError, "can't find tab \"#{@id}\" in #{@t}"
          end
        else
          pos = 'end' unless pos
          @path = @id = tk_call(@tpath, 'insert', pos, keys)
        end
      end
    end

    #######################################

    def get_tab(index)
      if (idx = tk_send_without_enc('id', tagindex(index))).empty?
        nil
      else
        Tk::BLT::Tabset::Tab.id2obj(self, idx)
      end
    end
    alias get_id get_tab

    def get_tabobj(index)
      if (idx = tk_send_without_enc('id', tagindex(index))).empty?
        nil
      else
        Tk::BLT::Tabnotebook::Tab.new(self, nil, idx)
      end
    end

    alias index_name index

    def insert(pos=nil, keys={})
      if pos.kind_of?(Hash)
        keys = pos
        pos = nil
      end
      pos = 'end' if pos.nil?
      Tk::BLT::Tabnotebook::Tab.new(self, nil, 
                                    tk_send('insert', tagindex(pos), keys))

    end
    undef :insert_tabs

    undef :tab_pageheight, :tab_pagewidth
  end
end