htmlgrid 1.1.0 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5ff89d7ef9b327cfe5f71794afc0e08acabe92ae
4
- data.tar.gz: 6669995c93c30107c4b20b207950fa3f7229ec0d
2
+ SHA256:
3
+ metadata.gz: eda73d2e1ec602956e9dac7af185179cc676906adf4a34fd1a683685c391ed49
4
+ data.tar.gz: c7668593f88170c009de8cc42839d69ec24834aec487baed336152eab1f979a4
5
5
  SHA512:
6
- metadata.gz: 3a659474980dc94623435c3ede8307cf0249888ccb644187de53a29333936823780a4c3ae8a44a425d9bc15dc8b47865ca633a47ec1d31628ec7e7bffb44f6de
7
- data.tar.gz: fd7d0cd908342a8fc1c48ee087f985dad3bd33ef5ca86cbcc43bde20b6213baff3290cdbdf2db86fe872a32c00f832bb0ee31540474863fc6d031640f47342b2
6
+ metadata.gz: c85d82f860af997c13a4c6f3298a5ac1dfc1cfff668d28842b21f0e8723c4cc35cadb19fa4990070ba6fd3d735235d2ec0d1b54585e46a91ef229e3683af5ebf
7
+ data.tar.gz: 5701ee21b4d273fcef7e6caab0af4401f8d67019aff1214327d092567fa73798690aebec32163aa890cd79eb6f4984c6e90a676eb2ffaee38fbfe7dc0137f80d
@@ -2,11 +2,10 @@
2
2
  .travis.yml
3
3
  COPYING
4
4
  Gemfile
5
- Gemfile.lock
6
5
  History.txt
7
6
  LICENCE.txt
8
7
  Manifest.txt
9
- README.textile
8
+ README.md
10
9
  Rakefile
11
10
  ext/htmlgrid/MANIFEST
12
11
  ext/htmlgrid/extconf.rb
@@ -65,7 +64,6 @@ lib/htmlgrid/ulcomposite.rb
65
64
  lib/htmlgrid/ullist.rb
66
65
  lib/htmlgrid/urllink.rb
67
66
  lib/htmlgrid/value.rb
68
- test/rebuild.rb
69
67
  test/stub/cgi.rb
70
68
  test/test_component.rb
71
69
  test/test_composite.rb
@@ -79,5 +77,6 @@ test/test_list.rb
79
77
  test/test_select.rb
80
78
  test/test_template.rb
81
79
  test/test_text.rb
80
+ test/test_helper.rb
82
81
  usage-en.txt
83
82
  widget/Tooltip.js
@@ -213,7 +213,7 @@ module HtmlGrid
213
213
  def tabindex=(tab)
214
214
  @attributes.store('tabIndex', tab.to_s)
215
215
  end
216
- def to_html(context)
216
+ def to_html(context)
217
217
  _to_html(context, @value).to_s.force_encoding('utf-8')
218
218
  end
219
219
  @@nl2br_ptrn = /(\r\n)|(\n)|(\r)/
@@ -51,6 +51,21 @@ module HtmlGrid
51
51
  CSS_ID = nil
52
52
  DEFAULT_CLASS = Value
53
53
  LOOKANDFEEL_MAP = {}
54
+
55
+ def self.component(klass, key, name=nil)
56
+ methname = klass.to_s.downcase.gsub('::', '_') << '_' << key.to_s
57
+ define_method(methname) { |*args|
58
+ model, session = args
59
+ args = [model.send(key), session || @session, self]
60
+ if(name)
61
+ args.unshift(name)
62
+ lookandfeel_map.store(methname.to_sym, name.to_sym)
63
+ end
64
+ klass.new(*args)
65
+ }
66
+ methname.to_sym
67
+ end
68
+
54
69
  def init
55
70
  super
56
71
  setup_grid()
@@ -102,19 +117,6 @@ module HtmlGrid
102
117
  def symbol_map
103
118
  @symbol_map ||= self::class::SYMBOL_MAP.dup
104
119
  end
105
- def AbstractComposite.component(klass, key, name=nil)
106
- methname = klass.to_s.downcase.gsub('::', '_') << '_' << key.to_s
107
- define_method(methname) { |*args|
108
- model, session = args
109
- args = [model.send(key), @session, self]
110
- if(name)
111
- args.unshift(name)
112
- lookandfeel_map.store(methname.to_sym, name.to_sym)
113
- end
114
- klass.new(*args)
115
- }
116
- methname.to_sym
117
- end
118
120
  end
119
121
  class TagComposite < AbstractComposite
120
122
  def compose(model=@model)
@@ -5,13 +5,12 @@
5
5
 
6
6
  require 'htmlgrid/component'
7
7
  require 'htmlgrid/div'
8
+ require 'htmlgrid/template'
8
9
 
9
10
  module HtmlGrid
10
- class Component
11
+ class Component
11
12
  @@msie_ptrn = /MSIE\s*(\d)/
12
- attr_accessor :dojo_tooltip
13
- # FIXME
14
- # DOJO_VERSION >= 1.7.0 only (removed old version support)
13
+ attr_accessor :dojo_tooltip
15
14
  def dojo_tag(widget, args={}, inner_html='')
16
15
  div = HtmlGrid::Div.new(@model, @session, self)
17
16
  div.set_attribute('data-dojo-type', widget)
@@ -29,50 +28,54 @@ module HtmlGrid
29
28
  tooltip.value = value
30
29
  self.dojo_tooltip = tooltip
31
30
  end
32
- def dojo_parse_widgets
33
- if(@container.respond_to?(:dojo_parse_widgets))
34
- @container.dojo_parse_widgets
35
- end
36
- end
37
- unless(method_defined?(:dojo_dynamic_html))
31
+ def dojo_parse_on_load
32
+ if @container.respond_to?(:dojo_parse_on_load)
33
+ @container.dojo_parse_on_load
34
+ end
35
+ end
36
+ unless method_defined?(:dojo_dynamic_html)
38
37
  alias :dojo_dynamic_html :dynamic_html
39
38
  def dynamic_html(context)
40
39
  html = ''
41
40
  attrs = {
42
- 'data-dojo-type' => 'dijit/Tooltip',
43
- 'data-dojo-props' => "connectId:'#{css_id}'",
44
- 'id' => "#{css_id}_widget",
45
- 'style' => 'display: none',
41
+ 'data-dojo-type' => 'dijit/TooltipDialog',
42
+ 'data-dojo-props' => "connectId:#{css_id}",
43
+ 'id' => "#{css_id}_widget",
44
+ 'style' => 'display: none',
46
45
  }
47
- unless((match = @@msie_ptrn.match(@session.user_agent)) \
48
- && match[1].to_i < 7)
46
+ unless (match = @@msie_ptrn.match(@session.user_agent)) \
47
+ && match[1].to_i < 7
49
48
  attrs.update({
50
49
  'toggle' => 'fade',
51
50
  'toggleDuration' => '500',
52
51
  })
53
52
  end
54
- if(@dojo_tooltip.is_a?(String))
55
- attrs.store('href', "'#@dojo_tooltip'")
53
+ @dojo_tooltip ||= nil
54
+ if @dojo_tooltip.is_a?(String)
55
+ if @dojo_tooltip !~ /^http/ # e.g. javascript
56
+ attrs.store('href', "#@dojo_tooltip")
57
+ else
58
+ attrs.store('href', @dojo_tooltip)
59
+ end
56
60
  html << context.div(attrs)
57
- elsif(@dojo_tooltip.respond_to?(:to_html))
61
+ elsif @dojo_tooltip.respond_to?(:to_html)
58
62
  @dojo_tooltip.attributes.update(attrs)
59
63
  html << @dojo_tooltip.to_html(context).force_encoding('utf-8')
60
64
  end
61
- unless(html.empty? || dojo_parse_widgets)
62
- html << context.script('type' => 'text/javascript') {
63
- "dojoConfig.searchIds.push('#{css_id}')"
64
- }
65
+ unless html.empty? || dojo_parse_on_load
66
+ html << context.script('type' => 'text/javascript') { "dojoConfig.searchIds.push('#{css_id}')" }
65
67
  end
68
+ # call original dynamic_html
66
69
  dojo_dynamic_html(context) << html
67
70
  end
68
71
  end
69
- end
72
+ end
70
73
  module DojoToolkit
71
74
  module DojoTemplate
72
- DOJO_DEBUG = false
75
+ DOJO_DEBUG = true
73
76
  DOJO_BACK_BUTTON = false
74
77
  DOJO_ENCODING = nil
75
- DOJO_PARSE_WIDGETS = true
78
+ DOJO_PARSE_ON_LOAD = true
76
79
  DOJO_PREFIX = []
77
80
  DOJO_REQUIRE = []
78
81
  def dynamic_html_headers(context)
@@ -88,58 +91,35 @@ module HtmlGrid
88
91
  "{ name: '#{prefix}', location: '#{path}' }"
89
92
  }.join(",")
90
93
  end
91
- config = [
92
- "parseOnLoad: true",
93
- "isDebug: #{self.class::DOJO_DEBUG}",
94
- "preventBackButtonFix: #{!self.class::DOJO_BACK_BUTTON}",
95
- "bindEncoding: '#{encoding}'",
96
- "searchIds: []",
97
- "async: true",
98
- "urchin: ''",
94
+ puts "dynamic_html_headers with pkgs: #{packages}"
95
+ config =config = [
99
96
  "has: {
100
- 'dojo-firebug': #{self.class::DOJO_DEBUG},
101
- 'dojo-debug-messages': #{self.class::DOJO_DEBUG}
97
+ 'dojo-debug-messages': true
102
98
  }",
103
- "packages: [ #{packages} ]"
104
99
  ].join(',')
105
- args.store('data-dojo-config', config)
106
- args.store('src', dojo_path)
100
+ headers << %(<script>
101
+ var dojoConfig = {
102
+ parseOnLoad: true,
103
+ isDebug: true,
104
+ async: true,
105
+ urchin: '',
106
+ };
107
+ </script>)
107
108
  headers << context.script(args)
108
- args = { 'type' => 'text/javascript' }
109
- headers << context.script(args) {
110
- package_paths = self.class::DOJO_REQUIRE.map { |req|
111
- "'#{req}'"
112
- }.join(',')
113
- package_names = self.class::DOJO_REQUIRE.map { |req|
114
- req.split('/').last
115
- }.join(',')
116
- if @dojo_onloads
117
- onloads = ''
118
- @dojo_onloads.each { |onload|
119
- onloads << "#{onload}\n"
120
- }
121
- script =
122
- "require([#{package_paths}], function(#{package_names}) {" \
123
- "ready(function() {" \
124
- "#{onloads}" \
125
- "});" \
126
- "});"
109
+ { 'text/css' => File.join(File.dirname(dojo_path), "/resources/dojo.css"),
110
+ 'text/javascript' => dojo_path,
111
+ }.each do |type, path|
112
+ if (content = get_inline(path))
113
+ headers << context.style(:type =>type) { content }
127
114
  else
128
- script = "require([#{package_paths}]);"
115
+ headers << context.style(:type =>type, :src => path) { "@import \"#{path}\";" }
129
116
  end
130
- script
131
- }
132
- dojo_dir = File.dirname(dojo_path)
133
- headers << context.style(:type => "text/css") { <<-EOS
134
- @import "#{File.join(dojo_dir, "/resources/dojo.css")}";
135
- @import "#{File.join(dojo_dir, "../dijit/themes/tundra/tundra.css")}";
136
- EOS
137
- }
117
+ end
138
118
  headers
139
119
  end
140
- def dojo_parse_widgets
141
- self.class::DOJO_PARSE_WIDGETS
142
- end
120
+ def dojo_parse_on_load
121
+ self.class::DOJO_PARSE_ON_LOAD
122
+ end
143
123
  def onload=(script)
144
124
  (@dojo_onloads ||= []).push(script)
145
125
  end
@@ -61,7 +61,7 @@ module HtmlGrid
61
61
  end
62
62
  def __messages(ary, css_class, ypos=0)
63
63
  ary.sort_by { |item|
64
- (components.index(item.key) || [-1,-1]).reverse
64
+ (components.key(item.key) || [-1,-1]).reverse
65
65
  }.reverse.each { |item|
66
66
  __message(item, css_class, ypos)
67
67
  }
@@ -24,285 +24,268 @@
24
24
  #
25
25
  # HtmlGrid::Grid -- htmlgrid -- 23.02.2012 -- mhatakeyama@ywesee.com
26
26
  # HtmlGrid::Grid -- htmlgrid -- 12.01.2010 -- hwyss@ywesee.com
27
- require 'htmlgrid/version'
28
- begin
29
- VERSION = '1.0.8'
30
- begin
31
- # for gem install
32
- ext_dir = File.expand_path('../../ext/htmlgrid', File.dirname(__FILE__))
33
- ext_lib = File.join(ext_dir, 'htmlgrid.so')
34
- require ext_lib
35
- rescue LoadError
36
- # for setup.rb install
37
- require 'htmlgrid.so'
38
- end
39
- rescue LoadError
40
- puts "could not find htmlgrid.so, falling back to pure-ruby class"
41
- module HtmlGrid
42
- class Grid
43
- attr_accessor :width, :height
44
- private
45
- class Row
46
- class Field
47
- attr_reader :components
48
- attr_accessor :tag
49
- ALLOWED_ATTRIBUTES = [
50
- 'align',
51
- 'class',
52
- 'colspan',
53
- 'style',
54
- 'tag',
55
- 'title',
56
- ]
57
- def initialize
58
- @components = []
59
- @attributes = {}
60
- end
61
- def add(item)
62
- if(item.is_a? Array)
63
- @components += item
64
- else
65
- @components.push item
66
- end
67
- end
68
- def add_background
69
- compose
70
- @components.each { |component|
71
- component.add_background
72
- }
73
- if(@attributes["class"])
74
- @attributes["class"] += "-bg" unless @attributes["class"] =~ /-bg/
75
- else
76
- @attributes["class"] = "bg"
77
- end
78
- end
79
- def add_attribute(key, value)
80
- @attributes.store(key.to_s, value.to_s)
81
- end
82
- def add_component_style(style)
83
- @components.each { |cmp|
84
- cmp.set_attribute("class", style) if cmp.respond_to?(:set_attribute)
85
- }
86
- end
87
- def add_style(style)
88
- @attributes["class"] = style
89
- end
90
- def attribute(key)
91
- @attributes[key]
92
- end
93
- def colspan
94
- @attributes.fetch("colspan", 1).to_i
95
- end
96
- def colspan=(span)
97
- @attributes["colspan"] = span.to_s if span.to_i > 1
98
- end
99
- def component_html(cgi)
100
- html = ''
101
- @components.each { |component|
102
- if component.respond_to? :to_html
103
- html << component.to_html(cgi).to_s.force_encoding('utf-8')
104
- else
105
- html << component.to_s
106
- end
107
- }
108
- html = "&nbsp;" if html.empty?
109
- html
110
- end
111
- def tag=(tag)
112
- @tag = tag.to_s.downcase
113
- end
114
- def to_html(context)
115
- if(@tag && context.respond_to?(@tag))
116
- context.send(@tag, @attributes) {
117
- component_html(context) }
118
- else
119
- context.td(@attributes) {
120
- component_html(context) }
121
- end
122
- end
123
- end
124
- def initialize # Row
125
- @width = 1
126
- @fields = [Field.new]
127
- @attributes = {}
128
- end
129
- def initialize_row w
130
- if(w > @width)
131
- @width.upto(w-1) { |ii| @fields[ii] ||= Field.new }
132
- @width = w
133
- end
134
- end
135
- def add(item, x)
136
- (@fields[x] ||= Field.new).add item
137
- end
138
- def each_field(x, w=1)
139
- x.upto([x+w, @width].min - 1) { |xx|
140
- yield(@fields[xx])
141
- }
142
- end
143
- def to_html cgi
144
- cgi.tr(@attributes) {
145
- field_html(cgi)
146
- }
147
- end
148
- def field_attribute(key, x=0)
149
- @fields[x].attribute(key)
150
- end
151
- def field_html(cgi)
152
- html = ""
153
- span = 1
154
- @fields.each { |field|
155
- if(span < 2)
156
- html << field.to_html(cgi)
157
- span = field.colspan
158
- else
159
- span -= 1
160
- end
161
- }
162
- html
163
- end
164
- def set_attributes(attr)
165
- @attributes = attr
166
- end
167
- def [](x)
168
- begin
169
- @fields[x]
170
- rescue StandardError
171
- nil
172
- end
173
- end
174
- end
175
- public
176
- def initialize(attributes={}) # Grid
177
- @height = 1
178
- @width = 1
179
- @rows = [Row.new]
180
- @attributes = {
181
- "cellspacing" => "0",
182
- }.update(attributes)
183
- end
184
- def initialize_grid(w, h)
185
- if(w > @width || h > @height)
186
- floor = (w > @width) ? 0 : @height
187
- @width = [w, @width].max
188
- @height = [h, @height].max
189
- floor.upto(@height - 1) { |ii|
190
- (@rows[ii] ||= Row.new).initialize_row(@width)
191
- }
192
- end
193
- end
194
- def add(arg, x, y, col=false)
195
- if arg.kind_of? Enumerable
196
- if arg.kind_of? String
197
- add_field(arg, x, y)
198
- elsif arg.kind_of? Array
199
- arg.each do |item|
200
- add_field(item, x ? x : '', y)
201
- end
27
+ module HtmlGrid
28
+ class Grid
29
+ attr_accessor :width, :height
30
+ private
31
+ class Row
32
+ class Field
33
+ attr_reader :components, :tag
34
+ ALLOWED_ATTRIBUTES = [
35
+ 'align',
36
+ 'class',
37
+ 'colspan',
38
+ 'style',
39
+ 'tag',
40
+ 'title',
41
+ ]
42
+ def initialize
43
+ @components = []
44
+ @attributes = {}
45
+ @tag = nil
46
+ end
47
+ def add(item)
48
+ if(item.is_a? Array)
49
+ @components += item
202
50
  else
203
- if(col)
204
- add_column(arg, x, y)
51
+ @components.push item
52
+ end
53
+ end
54
+ def add_background
55
+ compose
56
+ @components.each { |component|
57
+ component.add_background
58
+ }
59
+ if(@attributes["class"])
60
+ @attributes["class"] += "-bg" unless @attributes["class"] =~ /-bg/
61
+ else
62
+ @attributes["class"] = "bg"
63
+ end
64
+ end
65
+ def add_attribute(key, value)
66
+ @attributes.store(key.to_s, value.to_s)
67
+ end
68
+ def add_component_style(style)
69
+ @components.each { |cmp|
70
+ cmp.set_attribute("class", style) if cmp.respond_to?(:set_attribute)
71
+ }
72
+ end
73
+ def add_style(style)
74
+ @attributes["class"] = style
75
+ end
76
+ def attribute(key)
77
+ @attributes[key]
78
+ end
79
+ def colspan
80
+ @attributes.fetch("colspan", 1).to_i
81
+ end
82
+ def colspan=(span)
83
+ @attributes["colspan"] = span.to_s if span.to_i > 1
84
+ end
85
+ def component_html(cgi)
86
+ html = ''
87
+ @components.each { |component|
88
+ if component.respond_to? :to_html
89
+ html << component.to_html(cgi).to_s.dup.force_encoding('utf-8')
205
90
  else
206
- add_row(arg, x, y)
91
+ html << component.to_s
207
92
  end
93
+ }
94
+ html = "&nbsp;" if html.empty?
95
+ html
96
+ end
97
+ def tag=(tag)
98
+ @tag = tag.to_s.downcase
99
+ end
100
+ def to_html(context)
101
+ if(@tag && context.respond_to?(@tag))
102
+ context.send(@tag, @attributes) {
103
+ component_html(context) }
104
+ else
105
+ context.td(@attributes) {
106
+ component_html(context) }
208
107
  end
209
- else
108
+ end
109
+ end
110
+ def initialize # Row
111
+ @width = 1
112
+ @fields = [Field.new]
113
+ @attributes = {}
114
+ end
115
+ def initialize_row w
116
+ if(w > @width)
117
+ @width.upto(w-1) { |ii| @fields[ii] ||= Field.new }
118
+ @width = w
119
+ end
120
+ end
121
+ def add(item, x)
122
+ (@fields[x] ||= Field.new).add item
123
+ end
124
+ def each_field(x, w=1)
125
+ x.upto([x+w, @width].min - 1) { |xx|
126
+ yield(@fields[xx])
127
+ }
128
+ end
129
+ def to_html cgi
130
+ cgi.tr(@attributes) {
131
+ field_html(cgi)
132
+ }
133
+ end
134
+ def field_attribute(key, x=0)
135
+ @fields[x].attribute(key)
136
+ end
137
+ def field_html(cgi)
138
+ html = ""
139
+ span = 1
140
+ @fields.each { |field|
141
+ if(span < 2)
142
+ html << field.to_html(cgi)
143
+ span = field.colspan
144
+ else
145
+ span -= 1
146
+ end
147
+ }
148
+ html
149
+ end
150
+ def set_attributes(attr)
151
+ @attributes = attr
152
+ end
153
+ def [](x)
154
+ begin
155
+ @fields[x]
156
+ rescue StandardError
157
+ nil
158
+ end
159
+ end
160
+ end
161
+ public
162
+ def initialize(attributes={}) # Grid
163
+ @height = 1
164
+ @width = 1
165
+ @rows = [Row.new]
166
+ @attributes = {
167
+ "cellspacing" => "0",
168
+ }.update(attributes)
169
+ end
170
+ def initialize_grid(w, h)
171
+ if(w > @width || h > @height)
172
+ floor = (w > @width) ? 0 : @height
173
+ @width = [w, @width].max
174
+ @height = [h, @height].max
175
+ floor.upto(@height - 1) { |ii|
176
+ (@rows[ii] ||= Row.new).initialize_row(@width)
177
+ }
178
+ end
179
+ end
180
+ def add(arg, x, y, col=false)
181
+ if arg.kind_of?(Enumerable)
182
+ if arg.kind_of?(String)
210
183
  add_field(arg, x, y)
184
+ elsif arg.kind_of?(Array)
185
+ arg.each do |item|
186
+ add_field(item, x ? x : '', y)
187
+ end
188
+ elsif col
189
+ add_column(arg, x, y)
190
+ else
191
+ add_row(arg, x, y)
211
192
  end
212
- end
213
- def add_attribute(key, value, x, y, w=1, h=1)
214
- each_field(x, y, w, h) { |field|
215
- field.add_attribute(key, value)
216
- }
217
- end
218
- def add_background(x, y, w=1, h=1)
219
- each_field(x, y, w, h) { |field|
220
- field.add_background(x, w)
221
- }
222
- end
223
- def add_column(arg, x, y)
224
- offset = 0
225
- arg.each do |item|
226
- add_field(item, x, y + offset)
227
- offset = offset.next
228
- end
229
- end
230
- def add_component_style(style, x, y, w=1, h=1)
231
- each_field(x, y, w, h) { |field|
232
- field.add_component_style(style)
233
- }
234
- end
235
- def add_field(arg, x, y)
236
- initialize_grid(x+1, y+1)
237
- (@rows[y] ||= Row.new).add(arg, x)
238
- end
239
- def add_row(arg, x, y)
240
- offset = 0
241
- arg.each do |item|
242
- add_field(item, x + offset, y)
243
- offset = offset.next
244
- end
245
- end
246
- def add_style(style, x, y, w=1, h=1)
247
- each_field(x, y, w, h) { |field|
248
- field.add_style(style)
249
- }
250
- end
251
- def add_tag(tag, x, y, w=1, h=1)
252
- initialize_grid(x+w, y+h)
253
- each_field(x, y, w, h) { |field|
254
- field.tag = tag
255
- }
256
- end
257
- def each_field(x, y, w=1, h=1)
258
- y.upto([y+h, @height].min - 1) { |yy|
259
- @rows[yy].each_field(x,w) { |field|
260
- yield(field)
261
- }
262
- }
263
- end
264
- def field_attribute(key, x=0, y=0)
265
- @rows[y].field_attribute(key, x)
266
- end
267
- def insert_row(y=0, arg=nil)
268
- @rows[y, 0] = Row.new
269
- @height += 1
270
- add(arg, 0, y)
271
- end
272
- def push(arg, x=0, y=height)
273
- add(arg, x, y)
274
- set_colspan(x,y)
275
- end
276
- def set_attribute(key, value)
277
- @attributes[key] = value
278
- end
279
- def set_attributes(hash)
280
- @attributes.update(hash)
281
- end
282
- def set_colspan(x=0, y=0, span=(@width - x))
283
- span = span.to_i
284
- initialize_grid(x+span, y+1)
285
- self[x,y].colspan = span
286
- end
287
- def set_row_attributes(attr={}, y=0, offset=0)
288
- # TODO
289
- # At the moment, offset value is not used
290
- # But probably offset value is used in grid.c
291
- initialize_grid(offset, y + 1)
292
- @rows[y].set_attributes(attr)
293
- end
294
- def to_html(cgi)
295
- cgi.table(@attributes) {
296
- @rows.collect { |row| row.to_html(cgi).force_encoding('utf-8') }.join
297
- }
298
- end
299
- def [](x, y)
300
- begin
301
- @rows[y][x]
302
- rescue StandardError
303
- nil
304
- end
305
- end
306
- end
307
- end
193
+ else
194
+ add_field(arg, x, y)
195
+ end
196
+ end
197
+ def add_attribute(key, value, x, y, w=1, h=1)
198
+ each_field(x, y, w, h) { |field|
199
+ field.add_attribute(key, value)
200
+ }
201
+ end
202
+ def add_background(x, y, w=1, h=1)
203
+ each_field(x, y, w, h) { |field|
204
+ field.add_background(x, w)
205
+ }
206
+ end
207
+ def add_column(arg, x, y)
208
+ offset = 0
209
+ arg.each do |item|
210
+ add_field(item, x, y + offset)
211
+ offset = offset.next
212
+ end
213
+ end
214
+ def add_component_style(style, x, y, w=1, h=1)
215
+ each_field(x, y, w, h) { |field|
216
+ field.add_component_style(style)
217
+ }
218
+ end
219
+ def add_field(arg, x, y)
220
+ initialize_grid(x+1, y+1)
221
+ (@rows[y] ||= Row.new).add(arg, x)
222
+ end
223
+ def add_row(arg, x, y)
224
+ offset = 0
225
+ arg.each do |item|
226
+ add_field(item, x + offset, y)
227
+ offset = offset.next
228
+ end
229
+ end
230
+ def add_style(style, x, y, w=1, h=1)
231
+ each_field(x, y, w, h) { |field|
232
+ field.add_style(style)
233
+ }
234
+ end
235
+ def add_tag(tag, x, y, w=1, h=1)
236
+ initialize_grid(x+w, y+h)
237
+ each_field(x, y, w, h) { |field|
238
+ field.tag = tag
239
+ }
240
+ end
241
+ def each_field(x, y, w=1, h=1)
242
+ y.upto([y+h, @height].min - 1) { |yy|
243
+ @rows[yy].each_field(x,w) { |field|
244
+ yield(field)
245
+ }
246
+ }
247
+ end
248
+ def field_attribute(key, x=0, y=0)
249
+ @rows[y].field_attribute(key, x)
250
+ end
251
+ def insert_row(y=0, arg=nil)
252
+ @rows[y, 0] = Row.new
253
+ @height += 1
254
+ add(arg, 0, y)
255
+ end
256
+ def push(arg, x=0, y=height)
257
+ add(arg, x, y)
258
+ set_colspan(x,y)
259
+ end
260
+ def set_attribute(key, value)
261
+ @attributes[key] = value
262
+ end
263
+ def set_attributes(hash)
264
+ @attributes.update(hash)
265
+ end
266
+ def set_colspan(x=0, y=0, span=(@width - x))
267
+ span = span.to_i
268
+ initialize_grid(x+span, y+1)
269
+ self[x,y].colspan = span
270
+ end
271
+ def set_row_attributes(attr={}, y=0, offset=0)
272
+ # TODO
273
+ # At the moment, offset value is not used
274
+ # But probably offset value is used in grid.c
275
+ initialize_grid(offset, y + 1)
276
+ @rows[y].set_attributes(attr)
277
+ end
278
+ def to_html(cgi)
279
+ cgi.table(@attributes) {
280
+ @rows.collect { |row| row.to_html(cgi).force_encoding('utf-8') }.join
281
+ }
282
+ end
283
+ def [](x, y)
284
+ begin
285
+ @rows[y][x]
286
+ rescue StandardError
287
+ nil
288
+ end
289
+ end
290
+ end
308
291
  end