rbcurse 0.1.1 → 0.1.2
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/CHANGELOG +40 -0
- data/Manifest.txt +4 -1
- data/README.txt +13 -12
- data/examples/rfe.rb +150 -34
- data/examples/rfe_renderer.rb +6 -0
- data/examples/sqlc.rb +419 -0
- data/examples/testd.db +0 -0
- data/examples/testtable.rb +0 -4
- data/examples/testtabp.rb +2 -0
- data/examples/testtodo.rb +73 -23
- data/examples/todocsv.csv +28 -0
- data/lib/rbcurse/defaultlistselectionmodel.rb +14 -0
- data/lib/rbcurse/listcellrenderer.rb +7 -0
- data/lib/rbcurse/listkeys.rb +7 -4
- data/lib/rbcurse/listscrollable.rb +144 -7
- data/lib/rbcurse/listselectable.rb +23 -2
- data/lib/rbcurse/rlistbox.rb +69 -15
- data/lib/rbcurse/rmessagebox.rb +14 -5
- data/lib/rbcurse/rtabbedpane.rb +64 -2
- data/lib/rbcurse/rtable.rb +223 -18
- data/lib/rbcurse/rtextarea.rb +34 -2
- data/lib/rbcurse/rtextview.rb +27 -4
- data/lib/rbcurse/rwidget.rb +9 -3
- data/lib/rbcurse/table/tablecellrenderer.rb +1 -0
- data/lib/rbcurse.rb +1 -1
- metadata +5 -3
- data/lib/rbcurse/rform.rb +0 -845
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'rbcurse/listselectable'
|
2
|
+
##
|
3
|
+
# Added ListSelectionEvents on 2009-02-13 23:33
|
1
4
|
module RubyCurses
|
2
5
|
class DefaultListSelectionModel
|
3
6
|
include EventHandler
|
@@ -9,10 +12,15 @@ module RubyCurses
|
|
9
12
|
@anchor_selection_index = -1
|
10
13
|
@lead_selection_index = -1
|
11
14
|
@selection_mode = :MULTIPLE
|
15
|
+
$log.debug " created DefaultListSelectionModel XXX"
|
12
16
|
end
|
13
17
|
|
14
18
|
def clear_selection
|
19
|
+
ix0 = @selected_indices.first
|
20
|
+
ix1 = @selected_indices.last
|
15
21
|
@selected_indices=[]
|
22
|
+
lse = ListSelectionEvent.new(ix0, ix1, self, :DELETE)
|
23
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
16
24
|
end
|
17
25
|
def is_selected_index ix
|
18
26
|
@selected_indices.include? ix
|
@@ -28,17 +36,23 @@ module RubyCurses
|
|
28
36
|
end
|
29
37
|
## TODO should go in sorted, and no dupes
|
30
38
|
def add_selection_interval ix0, ix1
|
39
|
+
$log.debug " def add_selection_interval #{ix0}, ix1"
|
31
40
|
if @selection_mode != :MULTIPLE
|
32
41
|
clear_selection
|
33
42
|
end
|
34
43
|
@anchor_selection_index = ix0
|
35
44
|
@lead_selection_index = ix1
|
36
45
|
ix0.upto(ix1) {|i| @selected_indices << i unless @selected_indices.include? i }
|
46
|
+
lse = ListSelectionEvent.new(ix0, ix1, self, :INSERT)
|
47
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
48
|
+
$log.debug " DLSM firing LIST_SELECTION EVENT #{lse}"
|
37
49
|
end
|
38
50
|
def remove_selection_interval ix0, ix1
|
39
51
|
@anchor_selection_index = ix0
|
40
52
|
@lead_selection_index = ix1
|
41
53
|
@selected_indices.delete_if {|x| x >= ix0 and x <= ix1}
|
54
|
+
lse = ListSelectionEvent.new(ix0, ix1, self, :DELETE)
|
55
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
42
56
|
end
|
43
57
|
def insert_index_interval ix0, len
|
44
58
|
@anchor_selection_index = ix0
|
@@ -93,6 +93,13 @@ module RubyCurses
|
|
93
93
|
graphic.printstring r, c, str % [len, _value], @color_pair,@attr
|
94
94
|
r += 1
|
95
95
|
end
|
96
|
+
=begin
|
97
|
+
if @parent.search_found_ix == row_index
|
98
|
+
if !@parent.find_offset.nil?
|
99
|
+
graphic.mvchgat(y=r, x=@parent.find_offset, @parent.find_offset1, Ncurses::A_NORMAL, $reversecolor, nil)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
=end
|
96
103
|
end
|
97
104
|
# ADD HERE
|
98
105
|
end
|
data/lib/rbcurse/listkeys.rb
CHANGED
@@ -5,14 +5,17 @@ module RubyCurses
|
|
5
5
|
# any changes to the vars after construction won't have an effect.
|
6
6
|
def install_list_keys
|
7
7
|
@KEY_ROW_SELECTOR ||= ?\C-x
|
8
|
+
@KEY_BLOCK_SELECTOR ||= ?\M-x
|
8
9
|
@KEY_GOTO_TOP ||= ?\M-0
|
9
10
|
@KEY_GOTO_BOTTOM ||= ?\M-9
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
#@KEY_ASK_FIND_FORWARD ||= ?\M-f
|
12
|
+
#@KEY_ASK_FIND_BACKWARD ||= ?\M-F
|
13
|
+
#@KEY_FIND_NEXT ||= ?\M-g
|
14
|
+
#@KEY_FIND_PREV ||= ?\M-G
|
14
15
|
@KEY_SCROLL_FORWARD ||= ?\C-n
|
15
16
|
@KEY_SCROLL_BACKWARD ||= ?\C-p
|
17
|
+
@KEY_SCROLL_RIGHT ||= ?\M-8
|
18
|
+
@KEY_SCROLL_LEFT ||= ?\M-7
|
16
19
|
|
17
20
|
@KEY_CLEAR_SELECTION ||= ?\M-e
|
18
21
|
@KEY_PREV_SELECTION ||= ?\M-"
|
@@ -8,6 +8,7 @@
|
|
8
8
|
# @pcol (used for horiz scrolling, starts at 0)
|
9
9
|
#
|
10
10
|
module ListScrollable
|
11
|
+
attr_reader :search_found_ix, :find_offset, :find_offset1
|
11
12
|
def previous_row
|
12
13
|
@oldrow = @current_index
|
13
14
|
@current_index -= 1 if @current_index > 0
|
@@ -61,9 +62,9 @@ module ListScrollable
|
|
61
62
|
def bounds_check
|
62
63
|
h = scrollatrow()
|
63
64
|
rc = row_count
|
64
|
-
|
65
|
+
#$log.debug " PRE CURR:#{@current_index}, TR: #{@toprow} RC: #{rc} H:#{h}"
|
65
66
|
@current_index = 0 if @current_index < 0 # not lt 0
|
66
|
-
@current_index = rc-1 if @current_index >= rc # not gt rowcount
|
67
|
+
@current_index = rc-1 if @current_index >= rc and rc>0 # not gt rowcount
|
67
68
|
@toprow = rc-h-1 if rc > h and @toprow > rc - h - 1 # toprow shows full page if possible
|
68
69
|
# curr has gone below table, move toprow forward
|
69
70
|
if @current_index - @toprow > h
|
@@ -74,11 +75,12 @@ module ListScrollable
|
|
74
75
|
end
|
75
76
|
#$log.debug " POST CURR:#{@current_index}, TR: #{@toprow} RC: #{rc} H:#{h}"
|
76
77
|
if @oldrow != @current_index
|
77
|
-
|
78
|
+
#$log.debug "going to call on leave and on enter"
|
78
79
|
on_leave_row @oldrow if respond_to? :on_leave_row # to be defined by widget that has included this
|
79
80
|
on_enter_row @current_index if respond_to? :on_enter_row # to be defined by widget that has included this
|
80
81
|
end
|
81
82
|
set_form_row
|
83
|
+
#set_form_col 0 # added 2009-02-15 23:33 # this works for lists but we don't want this in TextArea's
|
82
84
|
@repaint_required = true
|
83
85
|
end
|
84
86
|
# the cursor should be appropriately positioned
|
@@ -129,13 +131,13 @@ module ListScrollable
|
|
129
131
|
when KEY_UP
|
130
132
|
#select_prev_row
|
131
133
|
#up
|
132
|
-
|
134
|
+
#$log.debug " GOT KEY UP NEW SCROLL"
|
133
135
|
previous_row
|
134
136
|
when KEY_LEFT
|
135
137
|
when KEY_RIGHT
|
136
138
|
when KEY_DOWN
|
137
139
|
#down
|
138
|
-
|
140
|
+
#$log.debug " GOT KEY DOWN NEW SCROLL"
|
139
141
|
next_row
|
140
142
|
when KEY_ENTER, 10, 13
|
141
143
|
if respond_to? :fire
|
@@ -203,14 +205,149 @@ module ListScrollable
|
|
203
205
|
sar = scrollatrow + 1
|
204
206
|
@toprow = (@current_index / sar) * sar
|
205
207
|
|
206
|
-
|
208
|
+
#$log.debug "1 set_focus #{total}, sar #{sar}, toprow #{@toprow}, current_index #{@current_index}"
|
207
209
|
if total - @toprow < sar
|
208
210
|
@toprow = (total - sar)
|
209
211
|
end
|
210
|
-
|
212
|
+
#$log.debug "2 set_focus #{total}, sar #{sar}, toprow #{@toprow}, current_index #{@current_index}"
|
211
213
|
set_form_row # 2009-01-17 12:44
|
212
214
|
@repaint_required = true
|
213
215
|
#bounds_check
|
214
216
|
end
|
217
|
+
def install_keys
|
218
|
+
=begin
|
219
|
+
@KEY_ASK_FIND_FORWARD ||= ?\M-f
|
220
|
+
@KEY_ASK_FIND_BACKWARD ||= ?\M-F
|
221
|
+
@KEY_FIND_NEXT ||= ?\M-g
|
222
|
+
@KEY_FIND_PREV ||= ?\M-G
|
223
|
+
=end
|
224
|
+
@KEY_ASK_FIND ||= ?\M-f
|
225
|
+
@KEY_FIND_MORE ||= ?\M-g
|
226
|
+
end
|
227
|
+
def ask_search
|
228
|
+
options = ["Search backwards", "case insensitive", "Wrap around"]
|
229
|
+
sel,regex,hash = get_string_with_options("Enter regex to search", 20, @last_regex||"", "checkboxes"=>options, "checkbox_defaults"=>[@search_direction_prev,@search_case,@search_wrap])
|
230
|
+
return if sel != 0
|
231
|
+
@search_direction_prev = hash[options[0]]
|
232
|
+
@search_case = hash[options[1]]
|
233
|
+
@search_wrap = hash[options[2]]
|
234
|
+
if @search_direction_prev == true
|
235
|
+
ix = _find_prev regex, @current_index
|
236
|
+
else
|
237
|
+
ix = _find_next regex, @current_index
|
238
|
+
end
|
239
|
+
if ix.nil?
|
240
|
+
alert("No matching data for: #{regex}")
|
241
|
+
else
|
242
|
+
set_focus_on(ix)
|
243
|
+
set_form_col @find_offset1
|
244
|
+
@cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
|
245
|
+
end
|
246
|
+
end
|
247
|
+
def find_more
|
248
|
+
if @search_direction_prev
|
249
|
+
find_prev
|
250
|
+
else
|
251
|
+
find_next
|
252
|
+
end
|
253
|
+
end
|
254
|
+
# find forwards
|
255
|
+
# Using this to start a search or continue search
|
256
|
+
def _find_next regex=@last_regex, start = @search_found_ix
|
257
|
+
raise "No previous search" if regex.nil?
|
258
|
+
#$log.debug " _find_next #{@search_found_ix} : #{@current_index}"
|
259
|
+
fend = @list.size-1
|
260
|
+
if start != fend
|
261
|
+
start += 1 unless start == fend
|
262
|
+
@last_regex = regex
|
263
|
+
@search_start_ix = start
|
264
|
+
regex = Regexp.new(regex, Regexp::IGNORECASE) if @search_case
|
265
|
+
start.upto(fend) do |ix|
|
266
|
+
row = @list[ix]
|
267
|
+
m=row.match(regex)
|
268
|
+
if !m.nil?
|
269
|
+
@find_offset = m.offset(0)[0]
|
270
|
+
@find_offset1 = m.offset(0)[1]
|
271
|
+
@search_found_ix = ix
|
272
|
+
return ix
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
fend = start-1
|
277
|
+
start = 0
|
278
|
+
if @search_wrap
|
279
|
+
start.upto(fend) do |ix|
|
280
|
+
row = @list[ix]
|
281
|
+
m=row.match(regex)
|
282
|
+
if !m.nil?
|
283
|
+
@find_offset = m.offset(0)[0]
|
284
|
+
@find_offset1 = m.offset(0)[1]
|
285
|
+
@search_found_ix = ix
|
286
|
+
return ix
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
return nil
|
291
|
+
end
|
292
|
+
def find_next
|
293
|
+
ix = _find_next
|
294
|
+
regex = @last_regex
|
295
|
+
if ix.nil?
|
296
|
+
alert("No more matching data for: #{regex}")
|
297
|
+
else
|
298
|
+
set_focus_on(ix)
|
299
|
+
set_form_col @find_offset1
|
300
|
+
@cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
|
301
|
+
end
|
302
|
+
end
|
303
|
+
def find_prev
|
304
|
+
ix = _find_prev
|
305
|
+
regex = @last_regex
|
306
|
+
if ix.nil?
|
307
|
+
alert("No previous matching data for: #{regex}")
|
308
|
+
else
|
309
|
+
set_focus_on(ix)
|
310
|
+
set_form_col @find_offset
|
311
|
+
@cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
|
312
|
+
end
|
313
|
+
end
|
314
|
+
##
|
315
|
+
# find backwards
|
316
|
+
# Using this to start a search or continue search
|
317
|
+
def _find_prev regex=@last_regex, start = @search_found_ix
|
318
|
+
raise "No previous search" if regex.nil?
|
319
|
+
#$log.debug " _find_prev #{@search_found_ix} : #{@current_index}"
|
320
|
+
if start != 0
|
321
|
+
start -= 1 unless start == 0
|
322
|
+
@last_regex = regex
|
323
|
+
@search_start_ix = start
|
324
|
+
regex = Regexp.new(regex, Regexp::IGNORECASE) if @search_case
|
325
|
+
start.downto(0) do |ix|
|
326
|
+
row = @list[ix]
|
327
|
+
m=row.match(regex)
|
328
|
+
if !m.nil?
|
329
|
+
@find_offset = m.offset(0)[0]
|
330
|
+
@find_offset1 = m.offset(0)[1]
|
331
|
+
@search_found_ix = ix
|
332
|
+
return ix
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
fend = start-1
|
337
|
+
start = @list.size-1
|
338
|
+
if @search_wrap
|
339
|
+
start.downto(fend) do |ix|
|
340
|
+
row = @list[ix]
|
341
|
+
m=row.match(regex)
|
342
|
+
if !m.nil?
|
343
|
+
@find_offset = m.offset(0)[0]
|
344
|
+
@find_offset1 = m.offset(0)[1]
|
345
|
+
@search_found_ix = ix
|
346
|
+
return ix
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
return nil
|
351
|
+
end
|
215
352
|
|
216
353
|
end
|
@@ -3,8 +3,13 @@
|
|
3
3
|
module RubyCurses
|
4
4
|
module ListSelectable
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
## modified on 2009-02-13 23:41 to return model if no param passed
|
7
|
+
def list_selection_model(*lsm)
|
8
|
+
if lsm.empty?
|
9
|
+
@list_selection_model
|
10
|
+
else
|
11
|
+
@list_selection_model = lsm[0]
|
12
|
+
end
|
8
13
|
#@list_selection_model.selection_mode = @selection_mode || :MULTIPLE
|
9
14
|
end
|
10
15
|
def create_default_list_selection_model
|
@@ -15,6 +20,7 @@ module RubyCurses
|
|
15
20
|
end
|
16
21
|
|
17
22
|
def add_row_selection_interval ix0, ix1
|
23
|
+
$log.debug " def add_row_selection_interval #{ix0}, ix1"
|
18
24
|
# if row_selection_allowed
|
19
25
|
@list_selection_model.add_selection_interval ix0, ix1
|
20
26
|
end
|
@@ -64,4 +70,19 @@ module RubyCurses
|
|
64
70
|
attr_accessor :row_selection_allowed
|
65
71
|
attr_accessor :column_selection_allowed
|
66
72
|
end
|
73
|
+
class ListSelectionEvent
|
74
|
+
attr_accessor :firstrow, :lastrow, :source, :type
|
75
|
+
def initialize firstrow, lastrow, source, type
|
76
|
+
@firstrow = firstrow
|
77
|
+
@lastrow = lastrow
|
78
|
+
@source = source
|
79
|
+
@type = type
|
80
|
+
end
|
81
|
+
def to_s
|
82
|
+
"#{@type.to_s}, firstrow: #{@firstrow}, lastrow: #{@lastrow}, source: #{@source}"
|
83
|
+
end
|
84
|
+
def inspect
|
85
|
+
to_s
|
86
|
+
end
|
87
|
+
end
|
67
88
|
end
|
data/lib/rbcurse/rlistbox.rb
CHANGED
@@ -44,6 +44,7 @@ module RubyCurses
|
|
44
44
|
include Enumerable
|
45
45
|
include RubyCurses::EventHandler
|
46
46
|
attr_accessor :selected_index
|
47
|
+
attr_reader :last_regex # should i really keep here as public or maintain in listbox
|
47
48
|
|
48
49
|
def initialize anarray
|
49
50
|
@list = anarray.dup
|
@@ -64,6 +65,7 @@ module RubyCurses
|
|
64
65
|
@list.index(obj)
|
65
66
|
end
|
66
67
|
def length ; @list.length; end
|
68
|
+
alias :size :length
|
67
69
|
|
68
70
|
def insert off0, *data
|
69
71
|
@list.insert off0, *data
|
@@ -112,7 +114,7 @@ module RubyCurses
|
|
112
114
|
@list.dup
|
113
115
|
end
|
114
116
|
def on_enter_row object
|
115
|
-
|
117
|
+
#$log.debug " XXX on_enter_row of list_data"
|
116
118
|
fire_handler :ENTER_ROW, object
|
117
119
|
end
|
118
120
|
# ##
|
@@ -143,10 +145,10 @@ module RubyCurses
|
|
143
145
|
return find_match @last_regex, start, @search_end_ix
|
144
146
|
end
|
145
147
|
##
|
146
|
-
# find backwards
|
148
|
+
# find backwards, list_data_model
|
147
149
|
# Using this to start a search or continue search
|
148
150
|
def find_prev regex=@last_regex, start = @search_found_ix
|
149
|
-
raise "No previous search" if @last_regex.nil?
|
151
|
+
raise "No previous search" if regex.nil? # @last_regex.nil?
|
150
152
|
$log.debug " find_prev #{@search_found_ix} : #{@current_index}"
|
151
153
|
start -= 1 unless start == 0
|
152
154
|
@last_regex = regex
|
@@ -427,6 +429,7 @@ module RubyCurses
|
|
427
429
|
select_default_values
|
428
430
|
# when the combo box has a certain row in focus, the popup should have the same row in focus
|
429
431
|
|
432
|
+
install_keys
|
430
433
|
init_vars
|
431
434
|
install_list_keys
|
432
435
|
|
@@ -531,7 +534,7 @@ module RubyCurses
|
|
531
534
|
h = scrollatrow()
|
532
535
|
rc = row_count
|
533
536
|
$log.debug " listbxo got ch #{ch}"
|
534
|
-
|
537
|
+
#$log.debug " when kps #{@KEY_PREV_SELECTION} "
|
535
538
|
case ch
|
536
539
|
when KEY_UP # show previous value
|
537
540
|
previous_row
|
@@ -565,14 +568,21 @@ module RubyCurses
|
|
565
568
|
@repaint_required = true
|
566
569
|
when 27, ?\C-c:
|
567
570
|
editing_canceled @current_index if @cell_editing_allowed
|
571
|
+
cancel_block # block
|
568
572
|
when @KEY_ASK_FIND_FORWARD
|
569
|
-
|
573
|
+
# ask_search_forward
|
570
574
|
when @KEY_ASK_FIND_BACKWARD
|
571
|
-
|
575
|
+
# ask_search_backward
|
572
576
|
when @KEY_FIND_NEXT
|
573
|
-
|
577
|
+
# find_next
|
574
578
|
when @KEY_FIND_PREV
|
575
|
-
|
579
|
+
# find_prev
|
580
|
+
when @KEY_ASK_FIND
|
581
|
+
ask_search
|
582
|
+
when @KEY_FIND_MORE
|
583
|
+
find_more
|
584
|
+
when @KEY_BLOCK_SELECTOR
|
585
|
+
mark_block #selection
|
576
586
|
else
|
577
587
|
# this has to be fixed, if compo does not handle key it has to continue into next part FIXME
|
578
588
|
ret = :UNHANDLED # changed on 2009-01-27 13:14 not going into unhandled, tab not released
|
@@ -606,8 +616,10 @@ module RubyCurses
|
|
606
616
|
set_focus_on(ix)
|
607
617
|
end
|
608
618
|
end
|
619
|
+
# gets string to search and calls data models find prev
|
609
620
|
def ask_search_backward
|
610
621
|
regex = get_string("Enter regex to search (backward)")
|
622
|
+
@last_regex = regex
|
611
623
|
ix = @list.find_prev regex, @current_index
|
612
624
|
if ix.nil?
|
613
625
|
alert("No matching data for: #{regex}")
|
@@ -615,7 +627,8 @@ module RubyCurses
|
|
615
627
|
set_focus_on(ix)
|
616
628
|
end
|
617
629
|
end
|
618
|
-
|
630
|
+
## listbox find_prev
|
631
|
+
def OLDfind_prev
|
619
632
|
ix = @list.find_prev
|
620
633
|
regex = @last_regex
|
621
634
|
if ix.nil?
|
@@ -627,7 +640,7 @@ module RubyCurses
|
|
627
640
|
end
|
628
641
|
end
|
629
642
|
# table find_next
|
630
|
-
def
|
643
|
+
def OLDfind_next
|
631
644
|
ix = @list.find_next
|
632
645
|
regex = @last_regex
|
633
646
|
if ix.nil?
|
@@ -639,12 +652,12 @@ module RubyCurses
|
|
639
652
|
def on_enter
|
640
653
|
on_enter_row @current_index
|
641
654
|
set_form_row # added 2009-01-11 23:41
|
642
|
-
|
643
|
-
@repaint_required
|
655
|
+
#$log.debug " ONE ENTER LIST #{@current_index}, #{@form.row}"
|
656
|
+
@repaint_required = true
|
644
657
|
fire_handler :ENTER, self
|
645
658
|
end
|
646
659
|
def on_enter_row arow
|
647
|
-
|
660
|
+
#$log.debug " Listbox #{self} ENTER_ROW with curr #{@current_index}. row: #{arow} H: #{@handler.keys}"
|
648
661
|
#fire_handler :ENTER_ROW, arow
|
649
662
|
fire_handler :ENTER_ROW, self
|
650
663
|
@list.on_enter_row self
|
@@ -668,7 +681,8 @@ module RubyCurses
|
|
668
681
|
col = c+@left_margin # @form.col
|
669
682
|
# unfortunately 2009-01-11 19:47 combo boxes editable allows changing value
|
670
683
|
editor.prepare_editor self, row, col, value
|
671
|
-
|
684
|
+
editor.component.curpos = 0 # reset it after search, if user scrols down
|
685
|
+
set_form_col 0 #@left_margin
|
672
686
|
|
673
687
|
# set original value so we can cancel
|
674
688
|
# set row and col,
|
@@ -676,7 +690,7 @@ module RubyCurses
|
|
676
690
|
end
|
677
691
|
def on_leave_row arow
|
678
692
|
#$log.debug " Listbox #{self} leave with (cr: #{@current_index}) #{arow}: list[row]:#{@list[arow]}"
|
679
|
-
|
693
|
+
#$log.debug " Listbox #{self} leave with (cr: #{@current_index}) #{arow}: "
|
680
694
|
#fire_handler :LEAVE_ROW, arow
|
681
695
|
fire_handler :LEAVE_ROW, self
|
682
696
|
editing_completed arow
|
@@ -797,7 +811,47 @@ module RubyCurses
|
|
797
811
|
end
|
798
812
|
@repaint_required = true
|
799
813
|
end
|
814
|
+
def set_form_col col=0
|
815
|
+
super col+@left_margin
|
816
|
+
end
|
817
|
+
# experimental selection of multiple rows via block
|
818
|
+
# specify a block start and then a block end
|
819
|
+
# usage: bind mark_selection to a key. It works as a toggle.
|
820
|
+
# C-c will cancel any selection that has begun.
|
821
|
+
# added on 2009-02-19 22:37
|
822
|
+
def mark_block #selection
|
823
|
+
if @inside_block
|
824
|
+
@inside_block = false
|
825
|
+
end_block #selection
|
826
|
+
else
|
827
|
+
@inside_block = true
|
828
|
+
start_block #selection
|
829
|
+
end
|
830
|
+
end
|
831
|
+
# added on 2009-02-19 22:37
|
832
|
+
def cancel_block
|
833
|
+
@first_index = @last_index = nil
|
834
|
+
@inside_block = false
|
835
|
+
end
|
836
|
+
# sets marker for start of block
|
837
|
+
# added on 2009-02-19 22:37
|
838
|
+
def start_block #selection
|
839
|
+
@first_index = @current_index
|
840
|
+
@last_index = nil
|
841
|
+
end
|
842
|
+
# sets marker for end of block
|
843
|
+
# added on 2009-02-19 22:37
|
844
|
+
def end_block #selection
|
845
|
+
@last_index = current_index
|
846
|
+
lower = [@first_index, @last_index].min
|
847
|
+
higher = [@first_index, @last_index].max
|
848
|
+
#lower.upto(higher) do |i| @list.toggle_row_selection i; end
|
849
|
+
add_row_selection_interval(lower, higher)
|
850
|
+
@repaint_required = true
|
851
|
+
end
|
852
|
+
|
800
853
|
|
854
|
+
# ADD HERE
|
801
855
|
end # class listb
|
802
856
|
|
803
857
|
|
data/lib/rbcurse/rmessagebox.rb
CHANGED
@@ -111,8 +111,14 @@ module RubyCurses
|
|
111
111
|
make_buttons ["&OK"]
|
112
112
|
when "ok_cancel" #, "input", "list", "field_list"
|
113
113
|
make_buttons %w[&OK &Cancel]
|
114
|
+
# experience 2009-02-22 12:52 trapping y and n - hopefully wont cause an edit problem
|
115
|
+
@form.bind_key(?o){ press(?\M-o) }
|
116
|
+
@form.bind_key(?c){ press(?\M-c) }
|
114
117
|
when "yes_no"
|
115
118
|
make_buttons %w[&Yes &No]
|
119
|
+
# experience 2009-02-22 12:52 trapping y and n - hopefully wont cause an edit problem
|
120
|
+
@form.bind_key(?y){ press(?\M-y) }
|
121
|
+
@form.bind_key(?n){ press(?\M-n) }
|
116
122
|
when "yes_no_cancel"
|
117
123
|
make_buttons ["&Yes", "&No", "&Cancel"]
|
118
124
|
when "custom"
|
@@ -170,7 +176,6 @@ module RubyCurses
|
|
170
176
|
return @selected_index
|
171
177
|
end
|
172
178
|
def press ch
|
173
|
-
#$log.debug "message box handle_keys : #{ch}" if ch != -1
|
174
179
|
case ch
|
175
180
|
when -1
|
176
181
|
return
|
@@ -183,12 +188,14 @@ module RubyCurses
|
|
183
188
|
if field.respond_to? :fire
|
184
189
|
field.fire
|
185
190
|
end
|
186
|
-
|
187
|
-
|
191
|
+
#$log.debug "popup ENTER : #{@selected_index} "
|
192
|
+
#$log.debug "popup ENTER : #{field.name}" if !field.nil?
|
188
193
|
@stop = true
|
189
194
|
return
|
190
195
|
when 9
|
191
196
|
@form.select_next_field
|
197
|
+
when 353
|
198
|
+
@form.select_prev_field
|
192
199
|
else
|
193
200
|
# fields must return unhandled else we will miss hotkeys.
|
194
201
|
# On messageboxes, often if no edit field, then O and C are hot.
|
@@ -234,7 +241,7 @@ module RubyCurses
|
|
234
241
|
# XXX this needs to go up and decide height of window
|
235
242
|
if @message_height.nil?
|
236
243
|
@message_height = (message.length/display_length)+1
|
237
|
-
$log.debug " print_message: mh:#{@message_height}"
|
244
|
+
$log.debug " print_message: mh:#{@message_height}, ml: #{message.length}"
|
238
245
|
end
|
239
246
|
@message_height ||= 1
|
240
247
|
width = @layout[:width]
|
@@ -251,6 +258,7 @@ module RubyCurses
|
|
251
258
|
@message_col = (width-message.length)/2
|
252
259
|
end
|
253
260
|
@message_row = row
|
261
|
+
# FIXME : wont print if newline at end of message !!!
|
254
262
|
#@window.printstring( row, @message_col , message, color=$reversecolor)
|
255
263
|
# 2008-12-30 19:45 experimenting with label so we can get justify and wrapping.
|
256
264
|
#@window.printstring( row, @message_col , message, color=$reversecolor)
|
@@ -264,6 +272,7 @@ module RubyCurses
|
|
264
272
|
@message_col ||= 2
|
265
273
|
r = @message_row + @message_height + 1
|
266
274
|
c = @message_col
|
275
|
+
disp_len = @layout[:width]-8
|
267
276
|
defaultvalue = @default_value || ""
|
268
277
|
input_config = @config["input_config"] || {}
|
269
278
|
case @type.to_s
|
@@ -272,7 +281,7 @@ module RubyCurses
|
|
272
281
|
name "input"
|
273
282
|
row r
|
274
283
|
col c
|
275
|
-
display_length
|
284
|
+
display_length disp_len
|
276
285
|
set_buffer defaultvalue
|
277
286
|
end
|
278
287
|
when "list"
|
data/lib/rbcurse/rtabbedpane.rb
CHANGED
@@ -74,6 +74,9 @@ module RubyCurses
|
|
74
74
|
include EventHandler
|
75
75
|
dsl_accessor :row, :col
|
76
76
|
dsl_accessor :height, :width
|
77
|
+
dsl_accessor :button_type # ok, ok_cancel, yes_no
|
78
|
+
dsl_accessor :buttons # used if type :custom
|
79
|
+
attr_reader :selected_index
|
77
80
|
def initialize win, aconfig={}, &block
|
78
81
|
@parent = win
|
79
82
|
@tabs ||= []
|
@@ -161,6 +164,7 @@ module RubyCurses
|
|
161
164
|
}
|
162
165
|
|
163
166
|
end
|
167
|
+
create_buttons
|
164
168
|
@form.repaint
|
165
169
|
end
|
166
170
|
def display_form form
|
@@ -183,7 +187,14 @@ module RubyCurses
|
|
183
187
|
return form
|
184
188
|
end
|
185
189
|
def handle_keys
|
186
|
-
|
190
|
+
begin
|
191
|
+
while (( ch=@window.getchar()) != 999)
|
192
|
+
if ch == ?\C-q
|
193
|
+
@selected_index = -1 # this signifies cancel by ?C-q
|
194
|
+
@stop = true
|
195
|
+
return
|
196
|
+
end
|
197
|
+
return if @stop
|
187
198
|
@current_form ||= @form
|
188
199
|
ret = @current_form.handle_key(ch)
|
189
200
|
case ret
|
@@ -220,15 +231,66 @@ module RubyCurses
|
|
220
231
|
@form.repaint
|
221
232
|
#return :UNHANDLED if ret == :UNHANDLED
|
222
233
|
end
|
234
|
+
return if @stop
|
223
235
|
@current_form.window.wrefresh
|
224
236
|
@window.refresh
|
225
237
|
end
|
226
|
-
|
238
|
+
ensure
|
239
|
+
destroy
|
240
|
+
end
|
227
241
|
end
|
228
242
|
def destroy
|
229
243
|
@window.destroy
|
230
244
|
@forms.each { |f| w = f.window; w.destroy unless w.nil? }
|
231
245
|
end
|
246
|
+
def create_buttons
|
247
|
+
case @button_type.to_s.downcase
|
248
|
+
when "ok"
|
249
|
+
make_buttons ["&OK"]
|
250
|
+
when "ok_cancel" #, "input", "list", "field_list"
|
251
|
+
make_buttons %w[&OK &Cancel]
|
252
|
+
when "yes_no"
|
253
|
+
make_buttons %w[&Yes &No]
|
254
|
+
when "yes_no_cancel"
|
255
|
+
make_buttons ["&Yes", "&No", "&Cancel"]
|
256
|
+
when "custom"
|
257
|
+
raise "Blank list of buttons passed to custom" if @buttons.nil? or @buttons.size == 0
|
258
|
+
make_buttons @buttons
|
259
|
+
else
|
260
|
+
$log.debug "No buttontype passed for creating tabbedpane. Using default (OK)"
|
261
|
+
make_buttons ["&OK"]
|
262
|
+
end
|
263
|
+
end
|
264
|
+
def make_buttons names
|
265
|
+
total = names.inject(0) {|total, item| total + item.length + 4}
|
266
|
+
bcol = center_column total
|
267
|
+
|
268
|
+
brow = @layout[:height]-2
|
269
|
+
button_ct=0
|
270
|
+
names.each_with_index do |bname, ix|
|
271
|
+
text = bname
|
272
|
+
#underline = @underlines[ix] if !@underlines.nil?
|
273
|
+
|
274
|
+
button = Button.new @form do
|
275
|
+
text text
|
276
|
+
name bname
|
277
|
+
row brow
|
278
|
+
col bcol
|
279
|
+
#underline underline
|
280
|
+
highlight_background $reversecolor
|
281
|
+
color $datacolor
|
282
|
+
bgcolor $datacolor
|
283
|
+
end
|
284
|
+
index = button_ct
|
285
|
+
button.command { |form| @selected_index = index; @stop = true; $log.debug "Pressed Button #{bname}";}
|
286
|
+
button_ct += 1
|
287
|
+
bcol += text.length+6
|
288
|
+
end
|
289
|
+
end
|
290
|
+
def center_column textlen
|
291
|
+
width = @layout[:width]
|
292
|
+
return (width-textlen)/2
|
293
|
+
end
|
232
294
|
|
233
295
|
##
|
234
296
|
# nested class tab
|