rbcurse 0.1.0

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.
Files changed (55) hide show
  1. data/CHANGELOG +1570 -0
  2. data/History.txt +6 -0
  3. data/Manifest.txt +54 -0
  4. data/README.txt +304 -0
  5. data/Rakefile +28 -0
  6. data/examples/qdfilechooser.rb +68 -0
  7. data/examples/rfe.rb +853 -0
  8. data/examples/rfe_renderer.rb +69 -0
  9. data/examples/test1.rb +242 -0
  10. data/examples/test2.rb +498 -0
  11. data/examples/testcombo.rb +95 -0
  12. data/examples/testkeypress.rb +61 -0
  13. data/examples/testmenu.rb +105 -0
  14. data/examples/testtable.rb +266 -0
  15. data/examples/testtabp.rb +106 -0
  16. data/examples/testtodo.rb +532 -0
  17. data/examples/viewtodo.rb +512 -0
  18. data/lib/rbcurse/action.rb +31 -0
  19. data/lib/rbcurse/applicationheader.rb +57 -0
  20. data/lib/rbcurse/celleditor.rb +120 -0
  21. data/lib/rbcurse/checkboxcellrenderer.rb +69 -0
  22. data/lib/rbcurse/colormap.rb +133 -0
  23. data/lib/rbcurse/comboboxcellrenderer.rb +45 -0
  24. data/lib/rbcurse/defaultlistselectionmodel.rb +49 -0
  25. data/lib/rbcurse/keylabelprinter.rb +143 -0
  26. data/lib/rbcurse/listcellrenderer.rb +99 -0
  27. data/lib/rbcurse/listkeys.rb +33 -0
  28. data/lib/rbcurse/listscrollable.rb +216 -0
  29. data/lib/rbcurse/listselectable.rb +67 -0
  30. data/lib/rbcurse/mapper.rb +108 -0
  31. data/lib/rbcurse/orderedhash.rb +77 -0
  32. data/lib/rbcurse/rcombo.rb +243 -0
  33. data/lib/rbcurse/rdialogs.rb +183 -0
  34. data/lib/rbcurse/rform.rb +845 -0
  35. data/lib/rbcurse/rinputdataevent.rb +36 -0
  36. data/lib/rbcurse/rlistbox.rb +804 -0
  37. data/lib/rbcurse/rmenu.rb +666 -0
  38. data/lib/rbcurse/rmessagebox.rb +325 -0
  39. data/lib/rbcurse/rpopupmenu.rb +754 -0
  40. data/lib/rbcurse/rtabbedpane.rb +259 -0
  41. data/lib/rbcurse/rtable.rb +1296 -0
  42. data/lib/rbcurse/rtextarea.rb +673 -0
  43. data/lib/rbcurse/rtextview.rb +335 -0
  44. data/lib/rbcurse/rwidget.rb +1731 -0
  45. data/lib/rbcurse/scrollable.rb +301 -0
  46. data/lib/rbcurse/selectable.rb +94 -0
  47. data/lib/rbcurse/table/tablecellrenderer.rb +85 -0
  48. data/lib/rbcurse/table/tabledatecellrenderer.rb +102 -0
  49. data/lib/rbcurse.rb +7 -0
  50. data/lib/ver/keyboard.rb +150 -0
  51. data/lib/ver/keyboard2.rb +170 -0
  52. data/lib/ver/ncurses.rb +102 -0
  53. data/lib/ver/window.rb +369 -0
  54. data/test/test_rbcurse.rb +0 -0
  55. metadata +118 -0
@@ -0,0 +1,259 @@
1
+ =begin
2
+ * Name: tabbed pane: can have multiple forms overlapping.
3
+ * Description:
4
+ * Author: rkumar
5
+
6
+ --------
7
+ * Date: 2008-12-13 13:06
8
+ * License:
9
+ Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
10
+
11
+ =end
12
+ require 'rubygems'
13
+ require 'ncurses'
14
+ require 'logger'
15
+ require 'rbcurse'
16
+
17
+ include Ncurses
18
+ include RubyCurses
19
+ module RubyCurses
20
+ extend self
21
+
22
+ # TODO : insert_tab, remove_tab, disable/hide tab
23
+ # Hotkeys should be defined with ampersand, too.
24
+ #
25
+ # Multiple independent overlapping forms using the tabbed metaphor.
26
+ class TabbedButton < RubyCurses::RadioButton
27
+ def getvalue_for_paint
28
+ @text
29
+ end
30
+ ##
31
+ # highlight abd selected colors and attribs should perhaps be in a
32
+ # structure, so user can override easily
33
+ def repaint # tabbedbutton
34
+ # $log.debug("BUTTon repaint : #{self.class()} r:#{@row} c:#{@col} #{getvalue_for_paint}" )
35
+ r,c = rowcol
36
+ attribs = @attrs
37
+ @highlight_foreground ||= $reversecolor
38
+ @highlight_background ||= 0
39
+ _state = @state
40
+ _state = :SELECTED if @variable.value == @value
41
+ case _state
42
+ when :HIGHLIGHTED
43
+ bgcolor = @highlight_background
44
+ color = @highlight_foreground
45
+ bgcolor = @bgcolor
46
+ color = @color
47
+ attribs = Ncurses::A_BOLD
48
+ when :SELECTED
49
+ bgcolor = @bgcolor
50
+ color = @color
51
+ attribs = Ncurses::A_REVERSE
52
+ else
53
+ bgcolor = @bgcolor
54
+ color = @color
55
+ end
56
+ #bgcolor = @state==:HIGHLIGHTED ? @highlight_background : @bgcolor
57
+ #color = @state==:HIGHLIGHTED ? @highlight_foreground : @color
58
+ if bgcolor.is_a? String and color.is_a? String
59
+ color = ColorMap.get_color(color, bgcolor)
60
+ end
61
+ value = getvalue_for_paint
62
+ # $log.debug("button repaint : r:#{r} c:#{c} col:#{color} bg #{bgcolor} v: #{value} ")
63
+ len = @display_length || value.length
64
+ @form.window.printstring r, c, "%-*s" % [len, value], color, attribs
65
+ # @form.window.mvchgat(y=r, x=c, max=len, Ncurses::A_NORMAL, bgcolor, nil)
66
+ if @underline != nil
67
+ # changed +1 to +0 on 2008-12-15 21:23 pls check.
68
+ @form.window.mvchgat(y=r, x=c+@underline+0, max=1, Ncurses::A_BOLD|Ncurses::A_UNDERLINE, color, nil)
69
+ end
70
+ end
71
+ end
72
+ class TabbedPane
73
+ include DSL
74
+ include EventHandler
75
+ dsl_accessor :row, :col
76
+ dsl_accessor :height, :width
77
+ def initialize win, aconfig={}, &block
78
+ @parent = win
79
+ @tabs ||= []
80
+ @forms ||= []
81
+ @bgcolor ||= "black" # 0
82
+ @color ||= "white" # $datacolor
83
+ @attr = nil
84
+ @current_form = nil
85
+ @current_tab = nil
86
+ @config = aconfig
87
+ @config.each_pair { |k,v| variable_set(k,v) }
88
+ instance_eval &block if block_given?
89
+ end
90
+ ##
91
+ # when adding tabs, you may use ampersand in text to create hotkey
92
+ def add_tab text, aconfig={}, &block
93
+ #create a button here and block is taken care of in button's instance
94
+ #or push this for later creation.
95
+ @tabs << Tab.new(text, aconfig, &block)
96
+ tab = @tabs.last
97
+ @forms << create_tab_form(tab)
98
+ tab.form = @forms.last
99
+ return tab
100
+ end
101
+ # private
102
+ def variable_set var, val
103
+ var = "@#{var}"
104
+ instance_variable_set(var, val)
105
+ end
106
+ # private
107
+ def configure(*val , &block)
108
+ case val.size
109
+ when 1
110
+ return @config[val[0]]
111
+ when 2
112
+ @config[val[0]] = val[1]
113
+ variable_set(val[0], val[1])
114
+ end
115
+ instance_eval &block if block_given?
116
+ end
117
+ def repaint
118
+ @window || create_window
119
+ @window.show
120
+ end
121
+ def show
122
+ repaint
123
+ end
124
+ def create_window
125
+ # first create the main top window with the tab buttons on it.
126
+ @layout = { :height => @height, :width => @width, :top => @row, :left => @col }
127
+ @window = VER::Window.new(@layout)
128
+ @form = RubyCurses::Form.new @window
129
+ @form.navigation_policy = :NON_CYCLICAL
130
+ @current_form = @form
131
+ @window.bkgd(Ncurses.COLOR_PAIR($datacolor));
132
+ @window.box( 0, 0);
133
+ @window.wrefresh
134
+ Ncurses::Panel.update_panels
135
+ col = 1
136
+ @buttons = []
137
+ ## create a button for each tab
138
+ $tabradio = Variable.new
139
+ @tabs.each do |tab|
140
+ text = tab.text
141
+ @buttons << RubyCurses::TabbedButton.new(@form) do
142
+ variable $tabradio
143
+ text text
144
+ name text
145
+ value text
146
+ row 1
147
+ col col
148
+ end
149
+ col += text.length+4
150
+ # @forms << create_tab_form(tab)
151
+ # form = @forms.last
152
+ form = tab.form
153
+ form.window = @window if form.window.nil? ## XXX
154
+ panel = form.window.panel
155
+ @buttons.last.command { Ncurses::Panel.top_panel(panel)
156
+ Ncurses::Panel.update_panels();
157
+ Ncurses.doupdate();
158
+ form.repaint
159
+ @current_form = form
160
+ @current_tab = form
161
+ }
162
+
163
+ end
164
+ @form.repaint
165
+ end
166
+ def display_form form
167
+ panel = form.window.panel
168
+ Ncurses::Panel.top_panel(panel)
169
+ Ncurses::Panel.update_panels();
170
+ Ncurses.doupdate();
171
+ form.repaint
172
+ end
173
+ def create_tab_form tab
174
+ layout = { :height => @height-2, :width => @width, :top => @row+2, :left => @col }
175
+ window = VER::Window.new(layout)
176
+ form = RubyCurses::Form.new window
177
+ form.navigation_policy = :NON_CYCLICAL
178
+ window.bkgd(Ncurses.COLOR_PAIR($datacolor));
179
+ window.box( 0, 0);
180
+ window.mvprintw(1,1, tab.text.tr('&', ''))
181
+ ##window.wrefresh
182
+ ##Ncurses::Panel.update_panels
183
+ return form
184
+ end
185
+ def handle_keys
186
+ while (( ch=@window.getchar()) != KEY_F1)
187
+ @current_form ||= @form
188
+ ret = @current_form.handle_key(ch)
189
+ case ret
190
+ when :NO_NEXT_FIELD
191
+ if @current_form != @form
192
+ @current_form = @form
193
+ #@current_form.select_field -1
194
+ @current_form.req_first_field
195
+ #ret = @current_form.handle_key(ch)
196
+ else
197
+ if !@current_tab.nil?
198
+ @current_form = @current_tab
199
+ display_form @current_form
200
+ @current_form.req_first_field
201
+ #@current_form.select_field -1
202
+ #ret = @current_form.handle_key(ch)
203
+ end
204
+ end
205
+ when :NO_PREV_FIELD
206
+ if @current_form != @form
207
+ $log.debug " 1 no prev field - going to button "
208
+ @current_form = @form
209
+ @current_form.req_last_field
210
+ else
211
+ if !@current_tab.nil?
212
+ @current_form = @current_tab
213
+ display_form @current_form
214
+ @current_form.req_last_field
215
+ end
216
+ end
217
+ when :UNHANDLED
218
+ $log.debug " unhandled in tabbed pane #{ch}"
219
+ ret = @form.process_key ch, self # field
220
+ @form.repaint
221
+ #return :UNHANDLED if ret == :UNHANDLED
222
+ end
223
+ @current_form.window.wrefresh
224
+ @window.refresh
225
+ end
226
+ destroy
227
+ end
228
+ def destroy
229
+ @window.destroy
230
+ @forms.each { |f| w = f.window; w.destroy unless w.nil? }
231
+ end
232
+
233
+ ##
234
+ # nested class tab
235
+ class Tab
236
+ attr_reader :text
237
+ attr_reader :config
238
+ attr_accessor :form
239
+ def initialize text, aconfig={}, &block
240
+ @text = text
241
+ @config = aconfig
242
+ @config.each_pair { |k,v| variable_set(k,v) }
243
+ instance_eval &block if block_given?
244
+ end
245
+ # private
246
+ def variable_set var, val
247
+ var = "@#{var}"
248
+ instance_variable_set(var, val)
249
+ end
250
+ def repaint
251
+
252
+
253
+ end
254
+ end
255
+
256
+ end # class Tabbedpane
257
+
258
+
259
+ end # module