rbcurse 1.4.0 → 1.4.1.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/NOTES +68 -0
  2. data/README.markdown +73 -330
  3. data/TODO2.txt +2 -2
  4. data/VERSION +1 -1
  5. data/examples/abasiclist.rb +8 -2
  6. data/examples/alpmenu.rb +1 -1
  7. data/examples/app.rb +1 -24
  8. data/examples/appdirtree.rb +1 -1
  9. data/examples/appemail.rb +8 -14
  10. data/examples/appemaillb.rb +2 -2
  11. data/examples/appgcompose.rb +7 -5
  12. data/examples/common/file.rb +40 -0
  13. data/examples/{rmail.rb → common/rmail.rb} +0 -0
  14. data/examples/data/README.markdown +9 -0
  15. data/examples/data/brew.txt +38 -0
  16. data/examples/data/color.2 +37 -0
  17. data/examples/data/gemlist.txt +60 -0
  18. data/examples/data/lotr.txt +12 -0
  19. data/examples/data/ports.txt +136 -0
  20. data/examples/data/tasks.txt +27 -0
  21. data/examples/{todocsv.csv → data/todocsv.csv} +0 -0
  22. data/examples/data/unix1.txt +21 -0
  23. data/examples/data/unix2.txt +11 -0
  24. data/examples/dbdemo.rb +49 -14
  25. data/examples/{appgmail.rb → deprecated/appgmail.rb} +1 -1
  26. data/examples/{splitp.rb → deprecated/splitp.rb} +0 -0
  27. data/examples/{testscrolllb.rb → deprecated/testscrolllb.rb} +0 -0
  28. data/examples/{testscrollp.rb → deprecated/testscrollp.rb} +0 -0
  29. data/examples/{testscrollta.rb → deprecated/testscrollta.rb} +0 -0
  30. data/examples/{testscrolltable.rb → deprecated/testscrolltable.rb} +0 -0
  31. data/examples/{testsplit.rb → deprecated/testsplit.rb} +0 -0
  32. data/examples/{testsplit2.rb → deprecated/testsplit2.rb} +0 -0
  33. data/examples/{testsplit3.rb → deprecated/testsplit3.rb} +0 -0
  34. data/examples/{testsplit3_1.rb → deprecated/testsplit3_1.rb} +0 -0
  35. data/examples/{testsplit3a.rb → deprecated/testsplit3a.rb} +0 -0
  36. data/examples/{testsplit3b.rb → deprecated/testsplit3b.rb} +0 -0
  37. data/examples/{testsplitta.rb → deprecated/testsplitta.rb} +0 -0
  38. data/examples/{testsplittv.rb → deprecated/testsplittv.rb} +0 -0
  39. data/examples/{testsplittvv.rb → deprecated/testsplittvv.rb} +0 -0
  40. data/examples/{testtpane.rb → deprecated/testtpane.rb} +0 -0
  41. data/examples/{testtpane2.rb → deprecated/testtpane2.rb} +0 -0
  42. data/examples/{testtpanetable.rb → deprecated/testtpanetable.rb} +0 -0
  43. data/examples/dirtree.rb +17 -7
  44. data/examples/experimental/resultsetdemo.rb +280 -0
  45. data/examples/experimental/testmform.rb +35 -0
  46. data/examples/{testscroller.rb → experimental/testscroller.rb} +1 -19
  47. data/examples/experimental/teststackflow.rb +111 -0
  48. data/examples/menu1.rb +1 -0
  49. data/examples/multispl.rb +4 -4
  50. data/examples/newmessagebox.rb +130 -0
  51. data/examples/newtabbedwindow.rb +100 -0
  52. data/examples/newtesttabp.rb +0 -3
  53. data/examples/qdfilechooser.rb +0 -3
  54. data/examples/rfe.rb +134 -18
  55. data/examples/rfe_renderer.rb +48 -2
  56. data/examples/sqlc.rb +2 -1
  57. data/examples/sqlm.rb +0 -2
  58. data/examples/table1.rb +1 -7
  59. data/examples/term2.rb +4 -1
  60. data/examples/test1.rb +0 -5
  61. data/examples/test2.rb +42 -31
  62. data/examples/testapp2.rb +8 -1
  63. data/examples/testchars.rb +0 -4
  64. data/examples/testcombo.rb +5 -9
  65. data/examples/testkeypress.rb +0 -3
  66. data/examples/testmenu.rb +0 -4
  67. data/examples/testmulticomp.rb +3 -5
  68. data/examples/testmulticontainer.rb +94 -0
  69. data/examples/testtable.rb +0 -5
  70. data/examples/testtabp.rb +16 -18
  71. data/examples/testtodo.rb +1 -5
  72. data/examples/testwsshortcuts.rb +64 -0
  73. data/examples/testwsshortcuts2.rb +126 -0
  74. data/examples/viewtodo.rb +1 -4
  75. data/lib/rbcurse.rb +1 -1
  76. data/lib/rbcurse/app.rb +92 -69
  77. data/lib/rbcurse/applicationheader.rb +46 -6
  78. data/lib/rbcurse/celleditor.rb +1 -9
  79. data/lib/rbcurse/comboboxcellrenderer.rb +0 -4
  80. data/lib/rbcurse/common/ansiparser.rb +117 -0
  81. data/{examples → lib/rbcurse/common}/appmethods.rb +25 -0
  82. data/lib/rbcurse/common/basestack.rb +407 -0
  83. data/lib/rbcurse/common/bordertitle.rb +41 -0
  84. data/lib/rbcurse/common/chunk.rb +177 -0
  85. data/lib/rbcurse/common/colorparser.rb +71 -0
  86. data/lib/rbcurse/common/keydefs.rb +30 -0
  87. data/lib/rbcurse/common/widgetshortcuts.rb +302 -0
  88. data/lib/rbcurse/deprecated/README.markdown +12 -0
  89. data/lib/rbcurse/{rscrollpane.rb → deprecated/rscrollpane.rb} +0 -0
  90. data/lib/rbcurse/{rsplitpane.rb → deprecated/rsplitpane.rb} +0 -0
  91. data/lib/rbcurse/{rsplitpane2.rb → deprecated/rsplitpane2.rb} +0 -0
  92. data/lib/rbcurse/{rviewport.rb → deprecated/rviewport.rb} +0 -0
  93. data/lib/rbcurse/experimental/README.markdown +14 -0
  94. data/lib/rbcurse/experimental/resultsettextview.rb +585 -0
  95. data/lib/rbcurse/experimental/stackflow.rb +478 -0
  96. data/lib/rbcurse/extras/bottomline.rb +85 -16
  97. data/lib/rbcurse/extras/box.rb +58 -0
  98. data/lib/rbcurse/extras/directorylist.rb +1 -1
  99. data/lib/rbcurse/extras/horizlist.rb +203 -0
  100. data/lib/rbcurse/extras/listselectable.rb +8 -0
  101. data/lib/rbcurse/extras/multiform.rb +330 -0
  102. data/lib/rbcurse/extras/multilinelabel.rb +142 -0
  103. data/lib/rbcurse/extras/newmessagebox.rb +328 -0
  104. data/lib/rbcurse/extras/newtabbedpane.rb +612 -0
  105. data/lib/rbcurse/extras/newtabbedwindow.rb +68 -0
  106. data/lib/rbcurse/extras/padreader.rb +189 -0
  107. data/lib/rbcurse/extras/rcomboedit.rb +256 -0
  108. data/lib/rbcurse/extras/resultsetbrowser.rb +281 -0
  109. data/lib/rbcurse/extras/statusline.rb +44 -6
  110. data/lib/rbcurse/extras/tabularwidget.rb +141 -104
  111. data/lib/rbcurse/extras/textpad.rb +516 -0
  112. data/lib/rbcurse/extras/viewer.rb +2 -0
  113. data/lib/rbcurse/io.rb +120 -3
  114. data/lib/rbcurse/listcellrenderer.rb +2 -1
  115. data/lib/rbcurse/listkeys.rb +1 -1
  116. data/lib/rbcurse/listscrollable.rb +72 -7
  117. data/lib/rbcurse/rbasiclistbox.rb +64 -12
  118. data/lib/rbcurse/rchangeevent.rb +0 -1
  119. data/lib/rbcurse/rcombo.rb +54 -59
  120. data/lib/rbcurse/rcommandwindow.rb +46 -10
  121. data/lib/rbcurse/rcontainer.rb +415 -0
  122. data/lib/rbcurse/rdialogs.rb +242 -165
  123. data/lib/rbcurse/rinputdataevent.rb +0 -1
  124. data/lib/rbcurse/rlistbox.rb +19 -9
  125. data/lib/rbcurse/rmessagebox.rb +1 -5
  126. data/lib/rbcurse/rmulticontainer.rb +64 -61
  127. data/lib/rbcurse/rmultitextview.rb +0 -2
  128. data/lib/rbcurse/rpopupmenu.rb +0 -2
  129. data/lib/rbcurse/rscrollform.rb +61 -12
  130. data/lib/rbcurse/rtabbedpane.rb +89 -73
  131. data/lib/rbcurse/rtabbedwindow.rb +53 -211
  132. data/lib/rbcurse/rtable.rb +0 -2
  133. data/lib/rbcurse/rtextarea.rb +14 -14
  134. data/lib/rbcurse/rtextview.rb +165 -50
  135. data/lib/rbcurse/rvimsplit.rb +15 -12
  136. data/lib/rbcurse/rwidget.rb +404 -150
  137. data/lib/rbcurse/table/tablecellrenderer.rb +1 -4
  138. data/lib/rbcurse/table/tabledatecellrenderer.rb +0 -3
  139. data/lib/ver/ncurses.rb +1 -9
  140. data/lib/ver/rpad.rb +375 -0
  141. data/lib/ver/window.rb +262 -440
  142. metadata +73 -31
@@ -23,6 +23,7 @@ module RubyCurses
23
23
  @repaint_required = true
24
24
  case @selection_mode
25
25
  when :multiple
26
+ @widget_scrolled = true # FIXME we need a better name
26
27
  if @selected_indices.include? crow
27
28
  @selected_indices.delete crow
28
29
  lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
@@ -34,10 +35,12 @@ module RubyCurses
34
35
  end
35
36
  else
36
37
  if @selected_index == crow
38
+ @old_selected_index = @selected_index # 2011-10-15 so we can unhighlight
37
39
  @selected_index = nil
38
40
  lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
39
41
  fire_handler :LIST_SELECTION_EVENT, lse
40
42
  else
43
+ @old_selected_index = @selected_index # 2011-10-15 so we can unhighlight
41
44
  @selected_index = crow
42
45
  lse = ListSelectionEvent.new(crow, crow, self, :INSERT)
43
46
  fire_handler :LIST_SELECTION_EVENT, lse
@@ -57,6 +60,7 @@ module RubyCurses
57
60
  max = [@last_clicked, crow].max
58
61
  case @selection_mode
59
62
  when :multiple
63
+ @widget_scrolled = true # FIXME we need a better name
60
64
  if @selected_indices.include? crow
61
65
  # delete from last_clicked until this one in any direction
62
66
  min.upto(max){ |i| @selected_indices.delete i }
@@ -79,11 +83,13 @@ module RubyCurses
79
83
  return if @selected_indices.nil? || @selected_indices.empty?
80
84
  @selected_indices = []
81
85
  @selected_index = nil
86
+ @old_selected_index = nil
82
87
  # Not sure what event type I should give, DELETE or a new one, user should
83
88
  # understand that selection has been cleared, and ignore first two params
84
89
  lse = ListSelectionEvent.new(0, @list.size, self, :CLEAR)
85
90
  fire_handler :LIST_SELECTION_EVENT, lse
86
91
  @repaint_required = true
92
+ @widget_scrolled = true # FIXME we need a better name
87
93
  end
88
94
  def is_row_selected crow=@current_index-@_header_adjustment
89
95
  case @selection_mode
@@ -114,6 +120,7 @@ module RubyCurses
114
120
  # should only be used if multiple selection interval
115
121
  def add_selection_interval ix0, ix1
116
122
  return if @selection_mode != :multiple
123
+ @widget_scrolled = true # FIXME we need a better name
117
124
  @anchor_selection_index = ix0
118
125
  @lead_selection_index = ix1
119
126
  ix0.upto(ix1) {|i| @selected_indices << i unless @selected_indices.include? i }
@@ -212,6 +219,7 @@ module RubyCurses
212
219
  def list_init_vars
213
220
  @selected_indices = []
214
221
  @selected_index = nil
222
+ @old_selected_index = nil
215
223
  #@row_selected_symbol = ''
216
224
  if @show_selector
217
225
  @row_selected_symbol ||= '*'
@@ -0,0 +1,330 @@
1
+ =begin
2
+ * Name: Multiform.rb
3
+ * Description View (cycle) multiple forms
4
+ * Author: rkumar (arunachalesha)
5
+ * file created 2011-10-17 8:18 PM
6
+ --------
7
+ * License:
8
+ Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
9
+
10
+ =end
11
+ require 'rbcurse'
12
+
13
+ include RubyCurses
14
+ module RubyCurses
15
+ extend self
16
+
17
+ # Trying to implement TabbedPanes using a multiform approach, but no more windows
18
+ # or pads. Try to keep it as simple as possible
19
+ class MultiForm < Widget
20
+ dsl_accessor :title
21
+
22
+
23
+ def initialize form = nil, config={}, &block
24
+ @focusable = true
25
+ @window = form.window
26
+ @row_offset = @col_offset = 1
27
+ @bmanager = BufferManager.new self
28
+ @forms = []
29
+ super
30
+ init_vars
31
+
32
+ end
33
+ def init_vars
34
+ super
35
+ # the following allows us to navigate buffers with :bn :bp etc (with Alt pressed)
36
+ bind_key(?\M-:, :buffer_menu)
37
+ bind_key(?\M-;, :buffer_menu)
38
+ # bind_key([?\C-x, ?f], :file_edit)
39
+ bind_key([?\C-x, ?k], :delete_component)
40
+ bind_key([?\C-x, ?\C-b], :list_components)
41
+ bind_key(?\M-n, :goto_next_component)
42
+ bind_key(?\M-p, :goto_prev_component)
43
+ bind_key(?\M-1, :goto_first_component)
44
+ # easily cycle using p. n is used for next search.
45
+ #bind_key(?p, :buffer_previous)
46
+ @suppress_borders = false
47
+ @repaint_all = true
48
+ @name ||= "multiform"
49
+ end
50
+ ## returns current buffer
51
+ # @return [RBuffer] current buffer
52
+ def current_component
53
+ @bmanager.current
54
+ end
55
+ ##
56
+ # multi-container
57
+ def handle_key ch #:nodoc:
58
+ @current_component.repaint
59
+ @current_component.window.wrefresh
60
+ $log.debug " MULTI handle_key #{ch}, #{@current_component}"
61
+ ret = :UNHANDLED
62
+ return :UNHANDLED unless @current_component
63
+ ret = @current_component.handle_key(ch)
64
+ $log.debug " MULTI comp #{@current_component} returned #{ret} "
65
+ if ret == :UNHANDLED
66
+ # check for bindings, these cannot override above keys since placed at end
67
+ begin
68
+ ret = process_key ch, self
69
+ $log.debug " MULTI = process_key returned #{ret} "
70
+ if ch > 177 && ch < 187
71
+ n = ch - 177
72
+ component_at(n)
73
+ # go to component n
74
+ end
75
+ rescue => err
76
+ # $error_message = err # changed 2010 dts
77
+ $error_message.value = err.to_s
78
+ #@form.window.print_error_message PLEASE CREATE LABEL
79
+ $log.error " Multicomponent process_key #{err} "
80
+ $log.debug(err.backtrace.join("\n"))
81
+ alert err.to_s
82
+ end
83
+ return :UNHANDLED if ret == :UNHANDLED
84
+ end
85
+ @current_component.repaint
86
+ @current_component.window.wrefresh
87
+ FFI::NCurses.update_panels
88
+
89
+ # check for any keys not handled and check our own ones
90
+ return ret #
91
+ end
92
+ def repaint
93
+ print_border if (@suppress_borders == false && @repaint_all) # do this once only, unless everything changes
94
+ return unless @current_component
95
+ $log.debug " MULTIFORM REPAINT "
96
+ ret = @current_component.repaint
97
+ end
98
+ def print_border #:nodoc:
99
+ $log.debug " #{@name} print_borders, #{@graphic.name} "
100
+ color = $datacolor
101
+ @graphic.print_border_only @row, @col, @height-1, @width, color #, Ncurses::A_REVERSE
102
+ print_title
103
+ end
104
+ def print_title #:nodoc:
105
+ $log.debug " print_title #{@row}, #{@col}, #{@width} #{@title} "
106
+ @graphic.printstring( @row, @col+(@width-@title.length)/2, @title, $datacolor, @title_attrib) unless @title.nil?
107
+ end
108
+ # this is just a test of the simple "most" menu
109
+ # can use this for next, prev, first, last, new, delete, overwrite etc
110
+ def buffer_menu
111
+ menu = PromptMenu.new self
112
+ menu.add(menu.create_mitem( 'l', "list buffers", "list buffers ", :list_components ))
113
+ item = menu.create_mitem( 'b', "Buffer Options", "Buffer Options" )
114
+ menu1 = PromptMenu.new( self, "Buffer Options")
115
+ menu1.add(menu1.create_mitem( 'n', "Next", "Switched to next buffer", :goto_next_component ))
116
+ menu1.add(menu1.create_mitem( 'p', "Prev", "Switched to previous buffer", :goto_prev_component ))
117
+ menu1.add(menu1.create_mitem( 'f', "First", "Switched to first buffer", :goto_first_component ))
118
+ menu1.add(menu1.create_mitem( 'l', "Last", "Switched to last buffer", :goto_last_component ))
119
+ menu1.add(menu1.create_mitem( 'd', "Delete", "Deleted buffer", :delete_component ))
120
+ item.action = menu1
121
+ menu.add(item)
122
+ # how do i know what's available. the application or window should know where to place
123
+ menu.display @form.window, $error_message_row, $error_message_col, $datacolor #, menu
124
+ end
125
+
126
+
127
+ def goto_next_component
128
+ perror "No other buffer" and return if @bmanager.size < 2
129
+
130
+ @current_component = @bmanager.next
131
+ set_current_component
132
+ # set_form_row and shit
133
+ end
134
+
135
+ def goto_prev_component
136
+ perror "No other buffer" and return if @bmanager.size < 2
137
+
138
+ @current_component = @bmanager.previous
139
+ $log.debug " buffer_prev got #{@current_component} "
140
+ set_current_component
141
+ end
142
+ def goto_first_component
143
+ @current_component = @bmanager.first
144
+ $log.debug " buffer_first got #{@current_component} "
145
+ set_current_component
146
+ end
147
+ def goto_last_component
148
+ @current_component = @bmanager.last
149
+ $log.debug " buffer_last got #{@current_component} "
150
+ set_current_component
151
+ end
152
+ def delete_component
153
+ if @bmanager.size > 1
154
+ @bmanager.delete_at
155
+ @current_component = @bmanager.previous
156
+ set_current_component
157
+ else
158
+ perror "Only one buffer. Cannot delete."
159
+ end
160
+ end
161
+
162
+ def component_at index
163
+ cc = @bmanager.element_at index
164
+ return unless cc
165
+ @current_component = cc
166
+ #$log.debug " buffer_last got #{@current_component} "
167
+ set_current_component
168
+ end
169
+ def add_form title, config={}, &blk
170
+ $log.debug "XXX: add_form window coords were hwtl #{@height} , #{@width} , #{@top} , #{@left} "
171
+ #w = VER::Window.new 16, 30, 2, 2 #@height-1, @width-1, @top, @left
172
+ w = VER::Window.new @height-2, @width-2, @row+1, @col+1
173
+ #w.box(0,0)
174
+ frm = Form.new w
175
+ @forms << frm
176
+ frm.parent_form = @form
177
+ frm.add_cols=@col+@col_offset
178
+ frm.add_rows=@row+@row_offset
179
+ @current_component = @bmanager.add frm, title
180
+ set_current_component
181
+ yield frm if block_given?
182
+ return @current_component # not a form but a Rcomponent containing component and title
183
+ end
184
+ def _add_to(index, component)
185
+ raise ArgumentError, "index out of bounds" unless @forms[index]
186
+ component.set_form(@forms[index])
187
+ $log.debug "XXX: comp r c #{component.row} #{component.col} "
188
+ component.row += @row
189
+ component.col += @col
190
+ $log.debug "XXX: after comp r c #{component.row} #{component.col} "
191
+ end
192
+ ##
193
+ # Add a component with a title
194
+ # @param [Widget] component
195
+ # @param [String] title
196
+ def add component, title
197
+ component.row = @row+@row_offset+0 # FFI changed 1 to 0 2011-09-12
198
+ component.col = @col+@col_offset+0 # FFI changed 1 to 0 2011-09-12
199
+ component.width = @width-2
200
+ component.height = @height-2
201
+ component.form = @form
202
+ component.override_graphic(@graphic)
203
+ @current_component = @bmanager.add component, title
204
+ set_current_component
205
+ set_form_row ## FFI added 2011-09-12 to get cursor at start when adding
206
+ $log.debug " ADD got cb : #{@current_component} "
207
+ end
208
+ def set_current_component
209
+ @title = @current_component.title
210
+ @current_component = @current_component.component
211
+ @current_component.repaint #2011-10-17 need to set all comps to repaint XXX
212
+ @current_component.window.wrefresh
213
+ @current_component.window.show
214
+ FFI::NCurses.update_panels
215
+ set_form_row
216
+ #@current_title = @current_component.title
217
+ #@current_component.repaint_all true 2011-10-17 need to set all comps to repaint XXX
218
+ end
219
+ def perror errmess
220
+ alert errmess
221
+ #@form.window.print_error_message errmess
222
+ end
223
+ def list_components
224
+ $log.debug " TODO buffers_list: #{@bmanager.size} "
225
+ menu = PromptMenu.new self
226
+ @bmanager.each_with_index{ |b, ix|
227
+ aproc = Proc.new { component_at(ix) }
228
+ name = b.title
229
+ num = ix + 1
230
+ menu.add(menu.create_mitem( num.to_s, name, "Switched to buffer #{ix}", aproc ))
231
+ }
232
+ menu.display @form.window, $error_message_row, $error_message_col, $datacolor
233
+ end
234
+ # required otherwise some components may not get correct cursor position on entry
235
+ # e.g. table
236
+ def on_enter
237
+ set_form_row # 2011-10-17
238
+ end
239
+ # nothing happening, the cursor goes to 1,1 and does not move
240
+ # alhough the fields can be edited XXX
241
+ def set_form_row #:nodoc:
242
+ if !@current_component.nil?
243
+ #$log.debug " #{@name} set_form_row calling sfr for #{@current_component.name} "
244
+ #fc = @current_component.widgets[0]
245
+ fc = @current_component.get_current_field
246
+ fc ||= @current_component.widgets[0]
247
+ fc.set_form_row if fc
248
+ #fc.set_form_col
249
+ end
250
+ end
251
+ # ADD HERE
252
+ end # class multicontainer
253
+ ##
254
+ # Handles multiple buffers, navigation, maintenance etc
255
+ # Instantiated at startup of
256
+ #
257
+ class BufferManager
258
+ include Enumerable
259
+ def initialize source
260
+ @source = source
261
+ @buffers = [] # contains RBuffer
262
+ @counter = 0
263
+ # for each buffer i need to store data, current_index (row), curpos (col offset) and title (filename).
264
+ end
265
+ def element_at index
266
+ @buffers[index]
267
+ end
268
+ def each
269
+ @buffers.each {|k| yield(k)}
270
+ end
271
+
272
+ ##
273
+ # @return [RBuffer] current buffer/file
274
+ ##
275
+ def current
276
+ @buffers[@counter]
277
+ end
278
+ ##
279
+ # Would have liked to just return next buffer and not get lost in details of caller
280
+ #
281
+ # @return [RBuffer] next buffer/file
282
+ ##
283
+ def next
284
+ @counter += 1
285
+ @counter = 0 if @counter >= @buffers.size
286
+ @buffers[@counter]
287
+ end
288
+ ##
289
+ # @return [RBuffer] previous buffer/file
290
+ ##
291
+ def previous
292
+ $log.debug " previous bs: #{@buffers.size}, #{@counter} "
293
+ @counter -= 1
294
+ return last() if @counter < 0
295
+ $log.debug " previous ctr #{@counter} "
296
+ @buffers[@counter]
297
+ end
298
+ def first
299
+ @counter = 0
300
+ @buffers[@counter]
301
+ end
302
+ def last
303
+ @counter = @buffers.size - 1
304
+ @buffers[@counter]
305
+ end
306
+ ##
307
+ def delete_at index=@counter
308
+ @buffers.delete_at index
309
+ end
310
+ def delete_by_name name
311
+ @buffers.delete_if {|b| b.filename == name }
312
+ end
313
+ def insert component, position, title=nil
314
+ anew = RComponents.new(component, title)
315
+ @buffers.insert position, anew
316
+ @counter = position
317
+ return anew
318
+ end
319
+ def add component, title=nil
320
+ #$log.debug " ADD H: #{component.height} C: #{component.width} "
321
+ insert component, @buffers.size, title
322
+ end
323
+ def size
324
+ @buffers.size
325
+ end
326
+ alias :count :size
327
+ end
328
+ RComponents = Struct.new(:component, :title)
329
+
330
+ end # modul
@@ -0,0 +1,142 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: multilinelabel.rb
3
+ # Description: Prints a label on the screen.
4
+ # This is the original label that was present in rwidgets.rb
5
+ # It allowed for multiple lines. I am simplifying that to a simple
6
+ # single line label.
7
+ # I am basically moving multiline labels out of hte core package
8
+ # Author: rkumar http://github.com/rkumar/rbcurse/
9
+ # Date: 2011-11-12 - 12:04
10
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
11
+ # Last update: 2011-11-12 - 12:05
12
+ # ----------------------------------------------------------------------------- #
13
+ #
14
+ module RubyCurses
15
+
16
+ # print static text on a form, allowing for text to be wrapped.
17
+ #
18
+ class MultiLineLabel < Widget
19
+ dsl_accessor :mnemonic # keyboard focus is passed to buddy based on this key (ALT mask)
20
+
21
+ # justify required a display length, esp if center.
22
+ dsl_property :justify #:right, :left, :center
23
+ dsl_property :display_length #please give this to ensure the we only print this much
24
+ #dsl_property :height #if you want a multiline label. already added to widget
25
+ # for consistency with others 2011-11-5
26
+ alias :width :display_length
27
+ alias :width= :display_length=
28
+
29
+ def initialize form, config={}, &block
30
+
31
+ # this crap was used in position_label, find another way. where is it used ?
32
+ #@row = config.fetch("row",-1) # why on earth this monstrosity ? 2011-11-5
33
+ #@col = config.fetch("col",-1)
34
+ #@bgcolor = config.fetch("bgcolor", $def_bg_color)
35
+ #@color = config.fetch("color", $def_fg_color)
36
+ @text = config.fetch("text", "NOTFOUND")
37
+ @editable = false
38
+ @focusable = false
39
+ super
40
+ @justify ||= :left
41
+ @name ||= @text
42
+ @repaint_required = true
43
+ end
44
+ #
45
+ # get the value for the label
46
+ def getvalue
47
+ @text_variable && @text_variable.value || @text
48
+ end
49
+ def label_for field
50
+ @label_for = field
51
+ #$log.debug " label for: #{@label_for}"
52
+ if @form
53
+ bind_hotkey
54
+ else
55
+ @when_form ||= []
56
+ @when_form << lambda { bind_hotkey }
57
+ end
58
+ end
59
+
60
+ ##
61
+ # for a button, fire it when label invoked without changing focus
62
+ # for other widgets, attempt to change focus to that field
63
+ def bind_hotkey
64
+ if !@mnemonic.nil?
65
+ ch = @mnemonic.downcase()[0].ord ## 1.9 DONE
66
+ # meta key
67
+ mch = ?\M-a.getbyte(0) + (ch - ?a.getbyte(0)) ## 1.9
68
+ if @label_for.is_a? RubyCurses::Button and @label_for.respond_to? :fire
69
+ @form.bind_key(mch, @label_for) { |_form, _butt| _butt.fire }
70
+ else
71
+ $log.debug " bind_hotkey label for: #{@label_for}"
72
+ @form.bind_key(mch, @label_for) { |_form, _field| _field.focus }
73
+ end
74
+ end
75
+ end
76
+
77
+ ##
78
+ # XXX need to move wrapping etc up and done once.
79
+ def repaint
80
+ return unless @repaint_required
81
+ raise "Label row or col nil #{@row} , #{@col}, #{@text} " if @row.nil? || @col.nil?
82
+ r,c = rowcol
83
+
84
+ @bgcolor ||= $def_bg_color
85
+ @color ||= $def_fg_color
86
+ # value often nil so putting blank, but usually some application error
87
+ value = getvalue_for_paint || ""
88
+ lablist = []
89
+ # trying out array values 2011-10-16 more for messageboxes.
90
+ if value.is_a? Array
91
+ lablist = text
92
+ @height = text.size
93
+ elsif @height && @height > 1
94
+ lablist = wrap_text(value, @display_length).split("\n")
95
+ else
96
+ # ensure we do not exceed
97
+ if !@display_length.nil?
98
+ if value.length > @display_length
99
+ value = value[0..@display_length-1]
100
+ end
101
+ end
102
+ lablist << value
103
+ end
104
+ len = @display_length || value.length
105
+ acolor = get_color $datacolor
106
+ $log.debug "label :#{@text}, #{value}, r #{r}, c #{c} col= #{@color}, #{@bgcolor} acolor #{acolor} j:#{@justify} dlL: #{@display_length} "
107
+ firstrow = r
108
+ _height = @height || 1
109
+ str = @justify.to_sym == :right ? "%*s" : "%-*s" # added 2008-12-22 19:05
110
+ # loop added for labels that are wrapped.
111
+ # TODO clear separately since value can change in status like labels
112
+
113
+ @graphic = @form.window if @graphic.nil? ## HACK messagebox givig this in repaint, 423 not working ??
114
+ 0.upto(_height-1) { |i|
115
+ @graphic.printstring r+i, c, " " * len , acolor,@attr
116
+ }
117
+ lablist.each_with_index do |_value, ix|
118
+ break if ix >= _height
119
+ if @justify.to_sym == :center
120
+ padding = (@display_length - _value.length)/2
121
+ _value = " "*padding + _value + " "*padding # so its cleared if we change it midway
122
+ end
123
+ @graphic.printstring r, c, str % [len, _value], acolor,@attr
124
+ r += 1
125
+ end
126
+ if !@mnemonic.nil?
127
+ ulindex = value.index(@mnemonic) || value.index(@mnemonic.swapcase)
128
+ @graphic.mvchgat(y=firstrow, x=c+ulindex, max=1, Ncurses::A_BOLD|Ncurses::A_UNDERLINE, acolor, nil)
129
+ end
130
+ #@form.window.mvchgat(y=r, x=c, max=len, Ncurses::A_NORMAL, color, nil)
131
+ @repaint_required = false
132
+ end
133
+ # Added 2011-10-22 to prevent some naive components from putting focus here.
134
+ def on_enter
135
+ raise "Cannot enter Label"
136
+ end
137
+ def on_leave
138
+ raise "Cannot leave Label"
139
+ end
140
+ # ADD HERE LABEL
141
+ end # class
142
+ end # module