wee 0.1.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/INSTALL +7 -0
- data/README +268 -0
- data/Rakefile +26 -0
- data/TODO +116 -0
- data/benchmark/Centrino1300/result.2000.counter.action +45 -0
- data/benchmark/Centrino1300/result.2000.counter.render +43 -0
- data/benchmark/Centrino1300/result.2000.filehandler +43 -0
- data/benchmark/Centrino600/result.2000.counter.action +47 -0
- data/benchmark/Centrino600/result.2000.counter.render +45 -0
- data/benchmark/Centrino600/result.2000.filehandler +43 -0
- data/benchmark/Makefile +48 -0
- data/benchmark/bench.sh +24 -0
- data/benchmark/counter.rb +96 -0
- data/benchmark/filehandler.rb +6 -0
- data/doc/rdoc/classes/Array.html +172 -0
- data/doc/rdoc/classes/Cache.html +126 -0
- data/doc/rdoc/classes/Cache/StorageCache.html +320 -0
- data/doc/rdoc/classes/Cache/Strategy.html +128 -0
- data/doc/rdoc/classes/Cache/Strategy/CapacityBounded.html +269 -0
- data/doc/rdoc/classes/Cache/Strategy/LFU.html +238 -0
- data/doc/rdoc/classes/Cache/Strategy/LFU/Item.html +111 -0
- data/doc/rdoc/classes/Cache/Strategy/LRU.html +238 -0
- data/doc/rdoc/classes/Cache/Strategy/LRU/Item.html +111 -0
- data/doc/rdoc/classes/Cache/Strategy/Unbounded.html +225 -0
- data/doc/rdoc/classes/Cache/Strategy/Unbounded/Item.html +111 -0
- data/doc/rdoc/classes/Enumerable.html +146 -0
- data/doc/rdoc/classes/LiteralMethod.html +196 -0
- data/doc/rdoc/classes/Object.html +178 -0
- data/doc/rdoc/classes/String.html +172 -0
- data/doc/rdoc/classes/Struct.html +174 -0
- data/doc/rdoc/classes/Wee.html +160 -0
- data/doc/rdoc/classes/Wee/AnswerDecoration.html +182 -0
- data/doc/rdoc/classes/Wee/Application.html +337 -0
- data/doc/rdoc/classes/Wee/Brush.html +245 -0
- data/doc/rdoc/classes/Wee/Brush/ActionCallbackMixin.html +149 -0
- data/doc/rdoc/classes/Wee/Brush/ActionMixin.html +146 -0
- data/doc/rdoc/classes/Wee/Brush/ActionURLCallbackMixin.html +157 -0
- data/doc/rdoc/classes/Wee/Brush/AnchorTag.html +210 -0
- data/doc/rdoc/classes/Wee/Brush/AssignMixin.html +141 -0
- data/doc/rdoc/classes/Wee/Brush/CallbackMixin.html +141 -0
- data/doc/rdoc/classes/Wee/Brush/FormTag.html +225 -0
- data/doc/rdoc/classes/Wee/Brush/GenericEncodedTextBrush.html +176 -0
- data/doc/rdoc/classes/Wee/Brush/GenericTagBrush.html +283 -0
- data/doc/rdoc/classes/Wee/Brush/GenericTextBrush.html +176 -0
- data/doc/rdoc/classes/Wee/Brush/ImageButtonTag.html +195 -0
- data/doc/rdoc/classes/Wee/Brush/InputCallbackMixin.html +149 -0
- data/doc/rdoc/classes/Wee/Brush/InputTag.html +172 -0
- data/doc/rdoc/classes/Wee/Brush/Page.html +193 -0
- data/doc/rdoc/classes/Wee/Brush/SelectListTag.html +267 -0
- data/doc/rdoc/classes/Wee/Brush/SelectOptionTag.html +177 -0
- data/doc/rdoc/classes/Wee/Brush/SubmitButtonTag.html +154 -0
- data/doc/rdoc/classes/Wee/Brush/TableDataTag.html +173 -0
- data/doc/rdoc/classes/Wee/Brush/TableHeaderTag.html +146 -0
- data/doc/rdoc/classes/Wee/Brush/TableRowTag.html +277 -0
- data/doc/rdoc/classes/Wee/Brush/TableTag.html +146 -0
- data/doc/rdoc/classes/Wee/Brush/TextAreaTag.html +229 -0
- data/doc/rdoc/classes/Wee/Brush/TextInputTag.html +154 -0
- data/doc/rdoc/classes/Wee/Callback.html +231 -0
- data/doc/rdoc/classes/Wee/CallbackRegistry.html +308 -0
- data/doc/rdoc/classes/Wee/CallbackStream.html +227 -0
- data/doc/rdoc/classes/Wee/Canvas.html +235 -0
- data/doc/rdoc/classes/Wee/Component.html +933 -0
- data/doc/rdoc/classes/Wee/Context.html +111 -0
- data/doc/rdoc/classes/Wee/Decoration.html +338 -0
- data/doc/rdoc/classes/Wee/Delegate.html +247 -0
- data/doc/rdoc/classes/Wee/ErrorPage.html +175 -0
- data/doc/rdoc/classes/Wee/ErrorResponse.html +180 -0
- data/doc/rdoc/classes/Wee/GenericResponse.html +162 -0
- data/doc/rdoc/classes/Wee/HtmlCanvas.html +751 -0
- data/doc/rdoc/classes/Wee/HtmlWriter.html +351 -0
- data/doc/rdoc/classes/Wee/LiteralMethodCallback.html +180 -0
- data/doc/rdoc/classes/Wee/MethodCallback.html +193 -0
- data/doc/rdoc/classes/Wee/Page.html +111 -0
- data/doc/rdoc/classes/Wee/Presenter.html +521 -0
- data/doc/rdoc/classes/Wee/RedirectResponse.html +150 -0
- data/doc/rdoc/classes/Wee/RefreshResponse.html +157 -0
- data/doc/rdoc/classes/Wee/RenderingContext.html +111 -0
- data/doc/rdoc/classes/Wee/Request.html +268 -0
- data/doc/rdoc/classes/Wee/RequestHandler.html +336 -0
- data/doc/rdoc/classes/Wee/Response.html +260 -0
- data/doc/rdoc/classes/Wee/Session.html +469 -0
- data/doc/rdoc/classes/Wee/SimpleIdGenerator.html +198 -0
- data/doc/rdoc/classes/Wee/Snapshot.html +211 -0
- data/doc/rdoc/classes/Wee/StateHolder.html +149 -0
- data/doc/rdoc/classes/Wee/StateRegistry.html +434 -0
- data/doc/rdoc/classes/Wee/StateRegistry/Snapshot.html +320 -0
- data/doc/rdoc/classes/Wee/StateRegistry/WithObject.html +153 -0
- data/doc/rdoc/classes/Wee/Utils.html +111 -0
- data/doc/rdoc/classes/Wee/Utils/LRUCache.html +148 -0
- data/doc/rdoc/classes/Wee/ValueHolder.html +220 -0
- data/doc/rdoc/classes/Wee/WEBrickAdaptor.html +330 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/INSTALL.html +118 -0
- data/doc/rdoc/files/README.html +466 -0
- data/doc/rdoc/files/lib/cache/cache_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/adaptors/webrick_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/application_rb.html +112 -0
- data/doc/rdoc/files/lib/wee/callback_rb.html +107 -0
- data/doc/rdoc/files/lib/wee/component_ext_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/component_rb.html +109 -0
- data/doc/rdoc/files/lib/wee/context_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/core/callback_rb.html +115 -0
- data/doc/rdoc/files/lib/wee/core/component_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/core/decoration_rb.html +133 -0
- data/doc/rdoc/files/lib/wee/core/presenter_rb.html +112 -0
- data/doc/rdoc/files/lib/wee/core/snapshot_rb.html +113 -0
- data/doc/rdoc/files/lib/wee/core/valueholder_rb.html +110 -0
- data/doc/rdoc/files/lib/wee/core_rb.html +131 -0
- data/doc/rdoc/files/lib/wee/decoration_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/holder_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/html_canvas_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/html_writer_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/idgen_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/page_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/presenter_rb.html +112 -0
- data/doc/rdoc/files/lib/wee/renderer/html/brushes_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/renderer/html/canvas_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/renderer/html/writer_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/rendering/html/brushes_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/rendering/html/canvas_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/rendering/html/writer_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/request_rb.html +113 -0
- data/doc/rdoc/files/lib/wee/requesthandler_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/response_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/session_rb.html +109 -0
- data/doc/rdoc/files/lib/wee/snapshot_ext_rb.html +101 -0
- data/doc/rdoc/files/lib/wee/snapshot_rb.html +107 -0
- data/doc/rdoc/files/lib/wee/state_registry_rb.html +110 -0
- data/doc/rdoc/files/lib/wee/stuff_rb.html +144 -0
- data/doc/rdoc/files/lib/wee/utils/cache_rb.html +108 -0
- data/doc/rdoc/files/lib/wee/webrick_rb.html +108 -0
- data/doc/rdoc/files/lib/wee_rb.html +132 -0
- data/doc/rdoc/fr_class_index.html +93 -0
- data/doc/rdoc/fr_file_index.html +51 -0
- data/doc/rdoc/fr_method_index.html +242 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/examples/ObjectSpaceBrowser.rb +199 -0
- data/examples/calendar.rb +366 -0
- data/examples/cc.rb +94 -0
- data/examples/draw.rb +91 -0
- data/examples/example.rb +223 -0
- data/examples/test.rb +66 -0
- data/examples/window.rb +53 -0
- data/lib/cache/cache.rb +9 -0
- data/lib/wee.rb +18 -8
- data/lib/wee/adaptors/webrick.rb +73 -0
- data/lib/wee/application.rb +69 -71
- data/lib/wee/context.rb +2 -12
- data/lib/wee/core.rb +15 -0
- data/lib/wee/core/callback.rb +108 -0
- data/lib/wee/core/component.rb +314 -0
- data/lib/wee/core/decoration.rb +129 -0
- data/lib/wee/core/presenter.rb +132 -0
- data/lib/wee/core/snapshot.rb +21 -0
- data/lib/wee/core/valueholder.rb +19 -0
- data/lib/wee/idgen.rb +13 -0
- data/lib/wee/page.rb +1 -1
- data/lib/wee/renderer/html/brushes.rb +435 -0
- data/lib/wee/renderer/html/canvas.rb +148 -0
- data/lib/wee/{html_writer.rb → renderer/html/writer.rb} +31 -16
- data/lib/wee/request.rb +57 -0
- data/lib/wee/requesthandler.rb +77 -0
- data/lib/wee/response.rb +77 -0
- data/lib/wee/session.rb +70 -64
- data/lib/wee/{snapshot.rb → snapshot_ext.rb} +4 -4
- data/test/components/calltest.rb +16 -0
- data/test/components/counter.rb +17 -0
- data/test/components/messagebox.rb +15 -0
- data/test/components/page.rb +14 -0
- data/test/components/page_decoration.rb +7 -0
- data/test/stress.rb +64 -0
- data/test/test_component.rb +106 -0
- data/test/test_html_canvas.rb +25 -0
- data/test/test_html_writer.rb +27 -0
- data/test/test_request.rb +13 -0
- data/test/utils/cross.rb +65 -0
- data/test/utils/generic_plotter.rb +28 -0
- data/test/utils/gnuplot.rb +31 -0
- data/test/utils/measure_memory.rb +9 -0
- data/test/utils/memory_plotter.rb +10 -0
- data/test/utils/object_plotter.rb +10 -0
- data/test/utils/webrick_background.rb +31 -0
- data/wee.gemspec +22 -0
- metadata +222 -18
- data/lib/wee/component.rb +0 -126
- data/lib/wee/delegate_decoration.rb +0 -22
- data/lib/wee/handler_registry.rb +0 -89
- data/lib/wee/holder.rb +0 -14
- data/lib/wee/html_canvas.rb +0 -379
- data/lib/wee/state_registry.rb +0 -173
- data/lib/wee/stuff.rb +0 -29
- data/lib/wee/webrick.rb +0 -15
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# This class is for backtracking the state of components (or
|
|
2
|
+
# decorations/presenters). Components that want an undo-facility to be
|
|
3
|
+
# implemented (triggered for example by a browsers back-button), have to
|
|
4
|
+
# overwrite the Component#backtrack_state method. Class Wee::Snapshot simply
|
|
5
|
+
# represents a collection of objects from which snapshots were taken via
|
|
6
|
+
# methods take_snapshot.
|
|
7
|
+
|
|
8
|
+
class Wee::Snapshot
|
|
9
|
+
def initialize
|
|
10
|
+
@objects = Hash.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def add(object)
|
|
14
|
+
oid = object.object_id
|
|
15
|
+
@objects[oid] = [object, object.take_snapshot] unless @objects.include?(oid)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def restore
|
|
19
|
+
@objects.each_value { |object, value| object.restore_snapshot(value) }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Implements a value holder. Useful for backtracking the reference assigned to
|
|
2
|
+
# an instance variable (not the object itself!). An example where this is used
|
|
3
|
+
# is the <tt>@decoration</tt> attribute of class Wee::Component.
|
|
4
|
+
|
|
5
|
+
class Wee::ValueHolder
|
|
6
|
+
attr_accessor :value
|
|
7
|
+
|
|
8
|
+
def initialize(value=nil)
|
|
9
|
+
@value = value
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def take_snapshot
|
|
13
|
+
@value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def restore_snapshot(value)
|
|
17
|
+
@value = value
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/wee/idgen.rb
ADDED
data/lib/wee/page.rb
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class Wee::Page < Struct.new(:snapshot, :
|
|
1
|
+
class Wee::Page < Struct.new(:snapshot, :callbacks); end
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
module Wee
|
|
2
|
+
|
|
3
|
+
class Brush
|
|
4
|
+
attr_accessor :parent, :canvas
|
|
5
|
+
|
|
6
|
+
def initialize
|
|
7
|
+
@parent = @canvas = @closed = nil
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def with(*args, &block)
|
|
11
|
+
raise "either args or block, but not both" if block and not args.empty?
|
|
12
|
+
|
|
13
|
+
@canvas.nest(&block) if block
|
|
14
|
+
@closed = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def close
|
|
18
|
+
with unless @closed
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class Brush::GenericTextBrush < Brush
|
|
23
|
+
def initialize(text)
|
|
24
|
+
super()
|
|
25
|
+
@text = text
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def with
|
|
29
|
+
doc = @canvas.document
|
|
30
|
+
doc << @text
|
|
31
|
+
super
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Brush::GenericEncodedTextBrush < Brush
|
|
37
|
+
def initialize(text)
|
|
38
|
+
super()
|
|
39
|
+
@text = text
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def with
|
|
43
|
+
doc = @canvas.document
|
|
44
|
+
doc.encode_text(@text)
|
|
45
|
+
super
|
|
46
|
+
nil
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
class Brush::GenericTagBrush < Brush
|
|
51
|
+
def initialize(tag)
|
|
52
|
+
super()
|
|
53
|
+
@tag = tag
|
|
54
|
+
@attributes = Hash.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def type(t)
|
|
58
|
+
@attributes["type"] = t
|
|
59
|
+
self
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def css_class(c)
|
|
63
|
+
@attributes["class"] = c
|
|
64
|
+
self
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def id(x)
|
|
68
|
+
@attributes["id"] = x
|
|
69
|
+
self
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def method_missing(m, arg)
|
|
73
|
+
@attributes[m.to_s] = arg.to_s
|
|
74
|
+
self
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def with(text=nil, &block)
|
|
78
|
+
doc = @canvas.document
|
|
79
|
+
doc.start_tag(@tag, @attributes)
|
|
80
|
+
if text
|
|
81
|
+
doc.text(text)
|
|
82
|
+
super(text, &block)
|
|
83
|
+
else
|
|
84
|
+
super(&block)
|
|
85
|
+
end
|
|
86
|
+
doc.end_tag(@tag)
|
|
87
|
+
nil
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class Brush::TableTag < Brush::GenericTagBrush
|
|
92
|
+
def initialize
|
|
93
|
+
super('table')
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class Brush::TableRowTag < Brush::GenericTagBrush
|
|
98
|
+
def initialize
|
|
99
|
+
super('tr')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def align_top
|
|
103
|
+
@attributes['align'] = 'top'
|
|
104
|
+
self
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def columns(*cols)
|
|
108
|
+
with {
|
|
109
|
+
cols.each {|col| @canvas.table_data(col) }
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def headings(*headers)
|
|
114
|
+
with {
|
|
115
|
+
headers.each {|head| @canvas.table_heading(head) }
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def spanning_column(str, colspan)
|
|
120
|
+
with {
|
|
121
|
+
@canvas.table_data.col_span(colspan).with(str)
|
|
122
|
+
}
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def spacer
|
|
126
|
+
with {
|
|
127
|
+
@canvas.table_data { @canvas.space }
|
|
128
|
+
}
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class Brush::InputTag < Brush::GenericTagBrush
|
|
134
|
+
def initialize
|
|
135
|
+
super('input')
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
%w(type name value size maxlength checked src).each do |meth|
|
|
139
|
+
eval %[
|
|
140
|
+
def #{ meth }(arg)
|
|
141
|
+
@attributes['#{ meth }'] = arg
|
|
142
|
+
self
|
|
143
|
+
end
|
|
144
|
+
]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def with
|
|
148
|
+
super
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
module Brush::CallbackMixin
|
|
153
|
+
private
|
|
154
|
+
|
|
155
|
+
def register_callback(type, &block)
|
|
156
|
+
raise ArgumentError, "no callback block given" if block.nil?
|
|
157
|
+
@canvas.rendering_context.callbacks.register_for(@canvas.current_component, type, &block)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
module Brush::InputCallbackMixin
|
|
162
|
+
include Brush::CallbackMixin
|
|
163
|
+
|
|
164
|
+
public
|
|
165
|
+
|
|
166
|
+
def callback(symbol=nil, &block)
|
|
167
|
+
raise ArgumentError if symbol and block
|
|
168
|
+
block = @canvas.current_component.method(symbol) unless block
|
|
169
|
+
name(register_callback(:input, &block))
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
module Brush::ActionCallbackMixin
|
|
174
|
+
include Brush::CallbackMixin
|
|
175
|
+
|
|
176
|
+
public
|
|
177
|
+
|
|
178
|
+
def callback(symbol=nil, &block)
|
|
179
|
+
raise ArgumentError if symbol and block
|
|
180
|
+
block = @canvas.current_component.method(symbol) unless block
|
|
181
|
+
name(register_callback(:action, &block))
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# The callback id is listed in the URL (not as a form-data field)
|
|
186
|
+
module Brush::ActionURLCallbackMixin
|
|
187
|
+
include Brush::CallbackMixin
|
|
188
|
+
|
|
189
|
+
public
|
|
190
|
+
|
|
191
|
+
def callback(symbol=nil, &block)
|
|
192
|
+
raise ArgumentError if symbol and block
|
|
193
|
+
block = @canvas.current_component.method(symbol) unless block
|
|
194
|
+
req = @canvas.rendering_context.request
|
|
195
|
+
url = req.build_url(req.request_handler_id, req.page_id, register_callback(:action, &block))
|
|
196
|
+
__set_url(url)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
class Brush::TextAreaTag < Brush::GenericTagBrush
|
|
201
|
+
include Brush::InputCallbackMixin
|
|
202
|
+
|
|
203
|
+
def initialize
|
|
204
|
+
super('textarea')
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
%w(name rows cols tabindex accesskey onfocus onblur onselect onchange).each do |meth|
|
|
208
|
+
eval %[
|
|
209
|
+
def #{ meth }(arg)
|
|
210
|
+
@attributes['#{ meth }'] = arg
|
|
211
|
+
self
|
|
212
|
+
end
|
|
213
|
+
]
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def disabled
|
|
217
|
+
@attributes['disabled'] = nil
|
|
218
|
+
self
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def readonly
|
|
222
|
+
@attributes['readonly'] = nil
|
|
223
|
+
self
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def with(*args, &block)
|
|
227
|
+
super
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
class Brush::SelectOptionTag < Brush::GenericTagBrush
|
|
232
|
+
def initialize
|
|
233
|
+
super('option')
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def selected(bool=true)
|
|
237
|
+
if bool
|
|
238
|
+
@attributes['selected'] = nil
|
|
239
|
+
else
|
|
240
|
+
@attributes.delete('selected')
|
|
241
|
+
end
|
|
242
|
+
self
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
class Brush::SelectListTag < Brush::GenericTagBrush
|
|
247
|
+
include Brush::InputCallbackMixin
|
|
248
|
+
|
|
249
|
+
def initialize(items)
|
|
250
|
+
super('select')
|
|
251
|
+
@items = items
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
%w(selected items labels).each do |meth|
|
|
255
|
+
eval %[
|
|
256
|
+
def #{ meth }(arg)
|
|
257
|
+
@#{ meth } = arg
|
|
258
|
+
self
|
|
259
|
+
end
|
|
260
|
+
]
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def multiple
|
|
264
|
+
@multiple = true
|
|
265
|
+
@attributes['multiple'] = nil
|
|
266
|
+
self
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
alias __old_callback callback
|
|
270
|
+
private :__old_callback
|
|
271
|
+
def callback(symbol=nil, &block)
|
|
272
|
+
raise ArgumentError if symbol and block
|
|
273
|
+
block = @canvas.current_component.method(symbol) unless block
|
|
274
|
+
|
|
275
|
+
@callback = block
|
|
276
|
+
self
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def with
|
|
280
|
+
@labels ||= @items.collect { |i| i.to_s }
|
|
281
|
+
@selected ||= Array.new
|
|
282
|
+
|
|
283
|
+
if @callback
|
|
284
|
+
__old_callback {|input|
|
|
285
|
+
choosen = input.list.map {|idx|
|
|
286
|
+
idx = Integer(idx)
|
|
287
|
+
raise "invalid index in select list" if idx < 0 or idx > @items.size
|
|
288
|
+
@items[idx]
|
|
289
|
+
}
|
|
290
|
+
raise "choosen more than one element from a non-multiple select list" if not @multiple and choosen.size > 1
|
|
291
|
+
@callback.call(choosen)
|
|
292
|
+
}
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
super do
|
|
296
|
+
@items.each_index do |i|
|
|
297
|
+
@canvas.option.value(i).selected(@selected.include?(@items[i])).with(@labels[i])
|
|
298
|
+
end
|
|
299
|
+
@canvas.text("")
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
class Brush::TextInputTag < Brush::InputTag
|
|
305
|
+
include Brush::InputCallbackMixin
|
|
306
|
+
|
|
307
|
+
def initialize
|
|
308
|
+
super
|
|
309
|
+
type('text')
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
class Brush::SubmitButtonTag < Brush::InputTag
|
|
314
|
+
include Brush::ActionCallbackMixin
|
|
315
|
+
|
|
316
|
+
def initialize
|
|
317
|
+
super
|
|
318
|
+
type('submit')
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# NOTE: The form-fields returned by a image-button-tag is browser-specific.
|
|
323
|
+
# Most browsers do not send the "name" key together with the value specified by
|
|
324
|
+
# "value", only "name.x" and "name.y". This conforms to the standard. But
|
|
325
|
+
# Firefox also sends "name"="value". This is why I raise an exception from the
|
|
326
|
+
# #value method. Note that it's neccessary to parse the passed form-fields and
|
|
327
|
+
# generate a "name" fields in the request, to make this image-button work.
|
|
328
|
+
|
|
329
|
+
class Wee::Brush::ImageButtonTag < Wee::Brush::InputTag
|
|
330
|
+
include Wee::Brush::ActionCallbackMixin
|
|
331
|
+
|
|
332
|
+
def initialize
|
|
333
|
+
super
|
|
334
|
+
type('image')
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def value(v)
|
|
338
|
+
raise "specified value will not be used in the request"
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
class Brush::TableDataTag < Brush::GenericTagBrush
|
|
343
|
+
def initialize
|
|
344
|
+
super('td')
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def align_top
|
|
348
|
+
@attributes['align'] = 'top'
|
|
349
|
+
self
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
class Brush::TableHeaderTag < Brush::GenericTagBrush
|
|
354
|
+
def initialize
|
|
355
|
+
super('th')
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
class Brush::FormTag < Brush::GenericTagBrush
|
|
361
|
+
include Brush::ActionURLCallbackMixin
|
|
362
|
+
|
|
363
|
+
def initialize
|
|
364
|
+
super('form')
|
|
365
|
+
@attributes['method'] = 'POST'
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def action(href)
|
|
369
|
+
@attributes['action'] = href
|
|
370
|
+
self
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
alias __set_url action
|
|
374
|
+
|
|
375
|
+
def with(*args, &block)
|
|
376
|
+
# If no action was specified, use a dummy one.
|
|
377
|
+
unless @attributes.has_key?('action')
|
|
378
|
+
req = @canvas.rendering_context.request
|
|
379
|
+
@attributes['action'] = req.build_url(req.request_handler_id, req.page_id)
|
|
380
|
+
end
|
|
381
|
+
super
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
class Brush::AnchorTag < Brush::GenericTagBrush
|
|
386
|
+
include Brush::ActionURLCallbackMixin
|
|
387
|
+
|
|
388
|
+
def initialize
|
|
389
|
+
super('a')
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def url(href)
|
|
393
|
+
@attributes['href'] = href
|
|
394
|
+
self
|
|
395
|
+
end
|
|
396
|
+
alias href url
|
|
397
|
+
|
|
398
|
+
alias __set_url url
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
class Brush::Page < Brush
|
|
403
|
+
def title(str)
|
|
404
|
+
@title = str
|
|
405
|
+
self
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def with(text=nil, &block)
|
|
409
|
+
doc = @canvas.document
|
|
410
|
+
doc.start_tag("html")
|
|
411
|
+
|
|
412
|
+
if @title
|
|
413
|
+
doc.start_tag("head")
|
|
414
|
+
doc.start_tag("title")
|
|
415
|
+
doc.text(@title)
|
|
416
|
+
doc.end_tag("title")
|
|
417
|
+
doc.end_tag("head")
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
doc.start_tag("body")
|
|
421
|
+
|
|
422
|
+
if text
|
|
423
|
+
doc.text(text)
|
|
424
|
+
super(text, &block)
|
|
425
|
+
else
|
|
426
|
+
super(&block)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
doc.end_tag("body")
|
|
430
|
+
doc.end_tag("html")
|
|
431
|
+
nil
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
end # module Wee
|