summaryrefslogtreecommitdiff
path: root/trunk/ext/tk/lib/tkextlib/iwidgets/tabset.rb
blob: 300ba9dee037d4e345e20b6b13f2263d9fafc82e (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#
#  tkextlib/iwidgets/tabset.rb
#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#

require 'tk'
require 'tkextlib/iwidgets.rb'

module Tk
  module Iwidgets
    class Tabset < Tk::Itk::Widget
    end
  end
end

class Tk::Iwidgets::Tabset
  TkCommandNames = ['::iwidgets::tabset'.freeze].freeze
  WidgetClassName = 'Tabset'.freeze
  WidgetClassNames[WidgetClassName] = self

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

  include TkItemConfigMethod

  def __item_cget_cmd(id)
    [self.path, 'tabcget', id]
  end
  private :__item_cget_cmd

  def __item_config_cmd(id)
    [self.path, 'tabconfigure', id]
  end
  private :__item_config_cmd

  def tagid(tagOrId)
    if tagOrId.kind_of?(Tk::Itk::Component)
      tagOrId.name
    else
      #_get_eval_string(tagOrId)
      tagOrId
    end
  end

  alias tabcget itemcget
  alias tabcget_strict itemcget_strict
  alias tabconfigure itemconfigure
  alias tabconfiginfo itemconfiginfo
  alias current_tabconfiginfo current_itemconfiginfo

  private :itemcget, :itemcget_strict
  private :itemconfigure, :itemconfiginfo, :current_itemconfiginfo

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

  def __boolval_optkeys
    super() << 'equaltabs' << 'raiseselect' << 'tabborders'
  end
  private :__boolval_optkeys

  def __strval_optkeys
    super() << 'backdrop'
  end
  private :__strval_optkeys

  def add(keys={})
    window(tk_call(@path, 'add', *hash_kv(keys)))
  end

  def delete(idx1, idx2=nil)
    if idx2
      tk_call(@path, 'delete', index(idx1), index(idx2))
    else
      tk_call(@path, 'delete', index(idx1))
    end
    self
  end

  def index(idx)
    number(tk_call(@path, 'index', tagid(idx)))
  end

  def insert(idx, keys={})
    window(tk_call(@path, 'insert', index(idx), *hash_kv(keys)))
  end

  def next
    tk_call(@path, 'next')
    self
  end

  def prev
    tk_call(@path, 'prev')
    self
  end

  def select(idx)
    tk_call(@path, 'select', index(idx))
    self
  end

  def show_tab(idx)
    if index(idx) == 0
      self.start = 0
      return
    end

    reutrn unless @canvas ||= self.winfo_children[0]

    delta = 1 if (delta = cget(:gap)) == 'overlap' ||
                   (delta = self.winfo_pixels(delta) + 1) <= 0

    case cget(:tabpos)
    when 's', 'n'
      if (head = tabcget(idx, :left)) < 0
        self.start -= head
        return
      end
      tabs_size = @canvas.winfo_width
      tab_start, tab_end = @canvas . 
        find_overlapping(head, 0, head + delta, @canvas.winfo_height) . 
        find_all{|id| @canvas.itemtype(id) == TkcPolygon} . 
        map!{|id| bbox = @canvas.bbox(id); [bbox[0], bbox[2]]} . max

    when 'e', 'w'
      if (head = tabcget(idx, :top)) < 0
        self.start -= head
        return
      end
      tabs_size = @canvas.winfo_height
      tab_start, tab_end = @canvas . 
        find_overlapping(0, head, @canvas.winfo_width, head + delta) . 
        find_all{|id| @canvas.itemtype(id) == TkcPolygon} . 
        map!{|id| bbox = @canvas.bbox(id); [bbox[1], bbox[3]]} . max
    end

    if (size = tab_end - tab_start + 1) > tabs_size
      self.start -= tab_start
    elsif head + size > tabs_size
      self.start -= head + size - tabs_size
    end

    self
  end
end