summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/tcllib/autoscroll.rb
blob: 800a70744ca3ff7d3784fa6d397fe90e908cb658 (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
#
#  tkextlib/tcllib/autoscroll.rb
#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
#   * Part of tcllib extension
#   * Provides for a scrollbar to automatically mapped and unmapped as needed
#
# (The following is the original description of the library.)
#
# This package allows scrollbars to be mapped and unmapped as needed 
# depending on the size and content of the scrollbars scrolled widget. 
# The scrollbar must be managed by either pack or grid, other geometry 
# managers are not supported.
#
# When managed by pack, any geometry changes made in the scrollbars parent 
# between the time a scrollbar is unmapped, and when it is mapped will be 
# lost. It is an error to destroy any of the scrollbars siblings while the 
# scrollbar is unmapped. When managed by grid, if anything becomes gridded 
# in the same row and column the scrollbar occupied it will be replaced by 
# the scrollbar when remapped.
#
# This package may be used on any scrollbar-like widget as long as it 
# supports the set subcommand in the same style as scrollbar. If the set 
# subcommand is not used then this package will have no effect.
#

require 'tk'
require 'tk/scrollbar'
require 'tkextlib/tcllib.rb'

# TkPackage.require('autoscroll', '1.0')
TkPackage.require('autoscroll')

module Tk
  module Tcllib
    module Autoscroll
      def self.package_version
	begin
	  TkPackage.require('autoscroll')
	rescue
	  ''
	end
      end
    end
  end

  module Scrollable
    def autoscroll(mode = nil)
      case mode
      when :x, 'x'
	if @xscrollbar
	  tk_send_without_enc('::autoscroll::autoscroll', @xscrollbar)
	end
      when :y, 'y'
	if @yscrollbar
	  tk_send_without_enc('::autoscroll::autoscroll', @yscrollbar)
	end
      when nil, :both, 'both'
	if @xscrollbar
	  tk_send_without_enc('::autoscroll::autoscroll', @xscrollbar)
	end
	if @yscrollbar
	  tk_send_without_enc('::autoscroll::autoscroll', @yscrollbar)
	end
      else
	fail ArgumentError, "'x', 'y' or 'both' (String or Symbol) is expected"
      end
      self
    end
    def unautoscroll(mode = nil)
      case mode
      when :x, 'x'
	if @xscrollbar
	  tk_send_without_enc('::autoscroll::unautoscroll', @xscrollbar)
	end
      when :y, 'y'
	if @yscrollbar
	  tk_send_without_enc('::autoscroll::unautoscroll', @yscrollbar)
	end
      when nil, :both, 'both'
	if @xscrollbar
	  tk_send_without_enc('::autoscroll::unautoscroll', @xscrollbar)
	end
	if @yscrollbar
	  tk_send_without_enc('::autoscroll::unautoscroll', @yscrollbar)
	end
      else
	fail ArgumentError, "'x', 'y' or 'both' (String or Symbol) is expected"
      end
      self
    end
  end
end

class TkScrollbar
  def autoscroll
    # Arranges for the already existing scrollbar to be mapped 
    # and unmapped as needed.
    tk_send_without_enc('::autoscroll::autoscroll', @path)
    self
  end
  def unautoscroll
    #     Returns the scrollbar to its original static state. 
    tk_send_without_enc('::autoscroll::unautoscroll', @path)
    self
  end
end