summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/tcllib/autoscroll.rb
blob: 7db3c2e2b75c1bffb36fab6fd0d83914e8e6fd3d (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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#
#  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'

module Tk
  module Tcllib
    module Autoscroll
      PACKAGE_NAME = 'autoscroll'.freeze
      def self.package_name
        PACKAGE_NAME
      end

      def self.package_version
        begin
          TkPackage.require('autoscroll')
        rescue
          ''
        end
      end

      def self.not_available
        fail RuntimeError, "'tkextlib/tcllib/autoscroll' extension is not available on your current environment."
      end

      def self.autoscroll(win)
        Tk::Tcllib::Autoscroll.not_available
      end

      def self.unautoscroll(win)
        Tk::Tcllib::Autoscroll.not_available
      end
    end
  end
end

module Tk
  module Scrollable
    def autoscroll(mode = nil)
      case mode
      when :x, 'x'
        if @xscrollbar
          Tk::Tcllib::Autoscroll.autoscroll(@xscrollbar)
        end
      when :y, 'y'
        if @yscrollbar
          Tk::Tcllib::Autoscroll.autoscroll(@yscrollbar)
        end
      when nil, :both, 'both'
        if @xscrollbar
          Tk::Tcllib::Autoscroll.autoscroll(@xscrollbar)
        end
        if @yscrollbar
          Tk::Tcllib::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::Tcllib::Autoscroll.unautoscroll(@xscrollbar)
        end
      when :y, 'y'
        if @yscrollbar
          Tk::Tcllib::Autoscroll.unautoscroll(@yscrollbar)
        end
      when nil, :both, 'both'
        if @xscrollbar
          Tk::Tcllib::Autoscroll.unautoscroll(@xscrollbar)
        end
        if @yscrollbar
          Tk::Tcllib::Autoscroll.unautoscroll(@yscrollbar)
        end
      else
        fail ArgumentError, "'x', 'y' or 'both' (String or Symbol) is expected"
      end
      self
    end
  end
end

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

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

module Tk
  module Tcllib
    class << Autoscroll
      undef not_available
    end

    module Autoscroll
      extend TkCore
      def self.autoscroll(win)
        tk_call_without_enc('::autoscroll::autoscroll', win.path)
      end

      def self.unautoscroll(win)
        tk_call_without_enc('::autoscroll::unautoscroll', win.path)
      end

      def self.wrap
        # v1.1
        tk_call_without_enc('::autoscroll::wrap')
      end

      def self.unwrap
        # v1.1
        tk_call_without_enc('::autoscroll::unwrap')
      end
    end
  end
end