cdk 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cdk.rb +7 -866
- data/lib/cdk/cdk_objs.rb +46 -423
- data/lib/cdk/components.rb +28 -0
- data/lib/cdk/{alphalist.rb → components/alphalist.rb} +9 -6
- data/lib/cdk/components/button.rb +405 -0
- data/lib/cdk/{buttonbox.rb → components/buttonbox.rb} +11 -11
- data/lib/cdk/{calendar.rb → components/calendar.rb} +13 -13
- data/lib/cdk/components/dialog.rb +343 -0
- data/lib/cdk/{dscale.rb → components/dscale.rb} +0 -0
- data/lib/cdk/{entry.rb → components/entry.rb} +18 -18
- data/lib/cdk/{fscale.rb → components/fscale.rb} +1 -1
- data/lib/cdk/{fselect.rb → components/fselect.rb} +16 -13
- data/lib/cdk/{fslider.rb → components/fslider.rb} +1 -1
- data/lib/cdk/components/graph.rb +386 -0
- data/lib/cdk/{histogram.rb → components/histogram.rb} +3 -3
- data/lib/cdk/{itemlist.rb → components/itemlist.rb} +14 -14
- data/lib/cdk/{label.rb → components/label.rb} +7 -7
- data/lib/cdk/{marquee.rb → components/marquee.rb} +7 -7
- data/lib/cdk/{matrix.rb → components/matrix.rb} +27 -27
- data/lib/cdk/{mentry.rb → components/mentry.rb} +18 -18
- data/lib/cdk/{menu.rb → components/menu.rb} +18 -18
- data/lib/cdk/{radio.rb → components/radio.rb} +12 -12
- data/lib/cdk/{scale.rb → components/scale.rb} +13 -13
- data/lib/cdk/{scroll.rb → components/scroll.rb} +23 -386
- data/lib/cdk/{scroller.rb → components/scroller.rb} +1 -1
- data/lib/cdk/{selection.rb → components/selection.rb} +14 -14
- data/lib/cdk/{slider.rb → components/slider.rb} +15 -15
- data/lib/cdk/{swindow.rb → components/swindow.rb} +14 -14
- data/lib/cdk/{template.rb → components/template.rb} +18 -18
- data/lib/cdk/{uscale.rb → components/uscale.rb} +0 -0
- data/lib/cdk/{uslider.rb → components/uslider.rb} +0 -0
- data/lib/cdk/{viewer.rb → components/viewer.rb} +88 -18
- data/lib/cdk/constants.rb +54 -0
- data/lib/cdk/display.rb +30 -35
- data/lib/cdk/draw.rb +4 -6
- data/lib/cdk/helpers/file.rb +43 -0
- data/lib/cdk/helpers/types.rb +13 -0
- data/lib/cdk/helpers/window.rb +64 -0
- data/lib/cdk/mixins/alignments.rb +55 -0
- data/lib/cdk/mixins/bindings.rb +73 -0
- data/lib/cdk/mixins/borders.rb +62 -0
- data/lib/cdk/mixins/common_controls.rb +14 -0
- data/lib/cdk/mixins/converters.rb +358 -0
- data/lib/cdk/mixins/exit_conditions.rb +31 -0
- data/lib/cdk/mixins/focusable.rb +17 -0
- data/lib/cdk/mixins/formattable.rb +15 -0
- data/lib/cdk/mixins/has_screen.rb +23 -0
- data/lib/cdk/mixins/has_title.rb +64 -0
- data/lib/cdk/mixins/justifications.rb +26 -0
- data/lib/cdk/mixins/list_support.rb +31 -0
- data/lib/cdk/mixins/movement.rb +140 -0
- data/lib/cdk/mixins/window_hooks.rb +18 -0
- data/lib/cdk/mixins/window_input.rb +61 -0
- data/lib/cdk/screen.rb +27 -3
- metadata +51 -29
- data/lib/cdk/dialog.rb +0 -727
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative 'cdk_objs'
|
1
|
+
require_relative '../cdk_objs'
|
2
2
|
|
3
3
|
module CDK
|
4
4
|
class MENU < CDK::CDKOBJS
|
@@ -69,7 +69,7 @@ module CDK
|
|
69
69
|
(CDK::MENU::TITLELINES...subsize[x]).to_a.each do |y|
|
70
70
|
y0 = y - CDK::MENU::TITLELINES
|
71
71
|
sublist_len = []
|
72
|
-
@sublist[x1][y0] =
|
72
|
+
@sublist[x1][y0] = char2Chtype(menu_list[x][y],
|
73
73
|
sublist_len, [])
|
74
74
|
@sublist_len[x1][y0] = sublist_len[0]
|
75
75
|
max = [max, sublist_len[0]].max
|
@@ -82,7 +82,7 @@ module CDK
|
|
82
82
|
end
|
83
83
|
|
84
84
|
title_len = []
|
85
|
-
@title[x1] =
|
85
|
+
@title[x1] = char2Chtype(menu_list[x][0], title_len, [])
|
86
86
|
@title_len[x1] = title_len[0]
|
87
87
|
@subsize[x1] = subsize[x] - CDK::MENU::TITLELINES
|
88
88
|
@title_win[x1] = cdkscreen.window.subwin(CDK::MENU::TITLELINES,
|
@@ -185,7 +185,7 @@ module CDK
|
|
185
185
|
# Draw the new sub-title.
|
186
186
|
self.selectItem(@current_subtitle, 0)
|
187
187
|
|
188
|
-
@pull_win[@current_title]
|
188
|
+
wrefresh(@pull_win[@current_title])
|
189
189
|
end
|
190
190
|
|
191
191
|
@input_window = @title_win[@current_title]
|
@@ -214,7 +214,7 @@ module CDK
|
|
214
214
|
def inject(input)
|
215
215
|
pp_return = 1
|
216
216
|
ret = -1
|
217
|
-
complete = false
|
217
|
+
@complete = false
|
218
218
|
|
219
219
|
# Set the exit type.
|
220
220
|
self.setExitType(0)
|
@@ -231,7 +231,7 @@ module CDK
|
|
231
231
|
if pp_return != 0
|
232
232
|
# Check for key bindings.
|
233
233
|
if self.checkBind(:MENU, input)
|
234
|
-
complete = true
|
234
|
+
@complete = true
|
235
235
|
else
|
236
236
|
case input
|
237
237
|
when Ncurses::KEY_LEFT
|
@@ -247,16 +247,16 @@ module CDK
|
|
247
247
|
self.setExitType(input)
|
248
248
|
@last_selection = @current_title * 100 + @current_subtitle
|
249
249
|
ret = @last_selection
|
250
|
-
complete = true
|
250
|
+
@complete = true
|
251
251
|
when CDK::KEY_ESC
|
252
252
|
self.cleanUpMenu
|
253
253
|
self.setExitType(input)
|
254
254
|
@last_selection = -1
|
255
255
|
ret = @last_selection
|
256
|
-
complete = true
|
256
|
+
@complete = true
|
257
257
|
when Ncurses::ERR
|
258
258
|
self.setExitType(input)
|
259
|
-
complete = true
|
259
|
+
@complete = true
|
260
260
|
when CDK::REFRESH
|
261
261
|
self.erase
|
262
262
|
self.refresh
|
@@ -264,12 +264,12 @@ module CDK
|
|
264
264
|
end
|
265
265
|
|
266
266
|
# Should we call a post-process?
|
267
|
-
if
|
267
|
+
if !@complete && !(@post_process_func.nil?)
|
268
268
|
@post_process_func.call(:MENU, self, @post_process_data, input)
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
|
-
if
|
272
|
+
if !@complete
|
273
273
|
self.setExitType(0)
|
274
274
|
end
|
275
275
|
|
@@ -308,13 +308,13 @@ module CDK
|
|
308
308
|
end
|
309
309
|
|
310
310
|
self.selectItem(@current_subtitle, x0)
|
311
|
-
@pull_win[@current_title]
|
311
|
+
wrefresh(@pull_win[@current_title])
|
312
312
|
|
313
313
|
# Highlight the title.
|
314
314
|
Draw.writeChtypeAttrib(@title_win[@current_title], 0, 0,
|
315
315
|
@title[@current_title], @title_attr, CDK::HORIZONTAL,
|
316
316
|
0, @title_len[@current_title])
|
317
|
-
@title_win[@current_title]
|
317
|
+
wrefresh(@title_win[@current_title])
|
318
318
|
end
|
319
319
|
|
320
320
|
# Erase a menu item subwindow
|
@@ -323,7 +323,7 @@ module CDK
|
|
323
323
|
|
324
324
|
# Redraw the sub-menu title.
|
325
325
|
self.drawTitle(@current_title)
|
326
|
-
@title_win[@current_title]
|
326
|
+
wrefresh(@title_win[@current_title])
|
327
327
|
end
|
328
328
|
|
329
329
|
# Draw the menu.
|
@@ -331,7 +331,7 @@ module CDK
|
|
331
331
|
# Draw in the menu titles.
|
332
332
|
(0...@menu_items).each do |x|
|
333
333
|
self.drawTitle(x)
|
334
|
-
@title_win[x]
|
334
|
+
wrefresh(@title_win[x])
|
335
335
|
end
|
336
336
|
end
|
337
337
|
|
@@ -373,9 +373,9 @@ module CDK
|
|
373
373
|
if self.validCDKObject
|
374
374
|
(0...@menu_items).each do |x|
|
375
375
|
@title_win[x].werase
|
376
|
-
@title_win[x]
|
376
|
+
wrefresh(@title_win[x])
|
377
377
|
@pull_win[x].werase
|
378
|
-
@pull_win[x]
|
378
|
+
wrefresh(@pull_win[x])
|
379
379
|
end
|
380
380
|
end
|
381
381
|
end
|
@@ -420,7 +420,7 @@ module CDK
|
|
420
420
|
def cleanUpMenu
|
421
421
|
# Erase the sub-menu.
|
422
422
|
self.eraseSubwin
|
423
|
-
@pull_win[@current_title]
|
423
|
+
wrefresh(@pull_win[@current_title])
|
424
424
|
|
425
425
|
# Refresh the screen.
|
426
426
|
@screen.refresh
|
@@ -64,7 +64,7 @@ module CDK
|
|
64
64
|
# Rejustify the x and y positions if we need to.
|
65
65
|
xtmp = [xplace]
|
66
66
|
ytmp = [yplace]
|
67
|
-
|
67
|
+
alignxy(cdkscreen.window, xtmp, ytmp, @box_width, @box_height)
|
68
68
|
xpos = xtmp[0]
|
69
69
|
ypos = ytmp[0]
|
70
70
|
|
@@ -130,7 +130,7 @@ module CDK
|
|
130
130
|
xpos = self.SCREEN_XPOS(0) + scrollbar_adj
|
131
131
|
|
132
132
|
@input_window.wmove(ypos, xpos)
|
133
|
-
@input_window
|
133
|
+
wrefresh(@input_window)
|
134
134
|
end
|
135
135
|
|
136
136
|
# This actually manages the radio widget.
|
@@ -167,7 +167,7 @@ module CDK
|
|
167
167
|
def inject(input)
|
168
168
|
pp_return = 1
|
169
169
|
ret = -1
|
170
|
-
complete = false
|
170
|
+
@complete = false
|
171
171
|
|
172
172
|
# Set the exit type
|
173
173
|
self.setExitType(0)
|
@@ -186,7 +186,7 @@ module CDK
|
|
186
186
|
if pp_return != 0
|
187
187
|
# Check for a predefined key binding.
|
188
188
|
if self.checkBind(:RADIO, input)
|
189
|
-
complete = true
|
189
|
+
@complete = true
|
190
190
|
else
|
191
191
|
case input
|
192
192
|
when Ncurses::KEY_UP
|
@@ -214,14 +214,14 @@ module CDK
|
|
214
214
|
when CDK::KEY_ESC
|
215
215
|
self.setExitType(input)
|
216
216
|
ret = -1
|
217
|
-
complete = true
|
217
|
+
@complete = true
|
218
218
|
when Ncurses::ERR
|
219
219
|
self.setExitType(input)
|
220
|
-
complete = true
|
220
|
+
@complete = true
|
221
221
|
when CDK::KEY_TAB, CDK::KEY_RETURN, Ncurses::KEY_ENTER
|
222
222
|
self.setExitType(input)
|
223
223
|
ret = @selected_item
|
224
|
-
complete = true
|
224
|
+
@complete = true
|
225
225
|
when CDK::REFRESH
|
226
226
|
@screen.erase
|
227
227
|
@screen.refresh
|
@@ -229,12 +229,12 @@ module CDK
|
|
229
229
|
end
|
230
230
|
|
231
231
|
# Should we call a post-process?
|
232
|
-
if
|
232
|
+
if !@complete && !(@post_process_func.nil?)
|
233
233
|
@post_process_func.call(:RADIO, self, @post_process_data, input)
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
237
|
-
if
|
237
|
+
if !@complete
|
238
238
|
self.drawList(@box)
|
239
239
|
self.setExitType(0)
|
240
240
|
end
|
@@ -399,7 +399,7 @@ module CDK
|
|
399
399
|
|
400
400
|
def getItems(list)
|
401
401
|
(0...@list_size).each do |j|
|
402
|
-
list <<
|
402
|
+
list << chtype2Char(@item[j])
|
403
403
|
end
|
404
404
|
return @list_size
|
405
405
|
end
|
@@ -484,14 +484,14 @@ module CDK
|
|
484
484
|
(0...list_size).each do |j|
|
485
485
|
lentmp = []
|
486
486
|
postmp = []
|
487
|
-
new_list <<
|
487
|
+
new_list << char2Chtype(list[j], lentmp, postmp)
|
488
488
|
new_len << lentmp[0]
|
489
489
|
new_pos << postmp[0]
|
490
490
|
if new_list[j].nil? || new_list[j].size == 0
|
491
491
|
status = false
|
492
492
|
break
|
493
493
|
end
|
494
|
-
new_pos[j] =
|
494
|
+
new_pos[j] = justify_string(box_width, new_len[j], new_pos[j]) + 3
|
495
495
|
widest_item = [widest_item, new_len[j]].max
|
496
496
|
end
|
497
497
|
if status
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative 'cdk_objs'
|
1
|
+
require_relative '../cdk_objs'
|
2
2
|
|
3
3
|
module CDK
|
4
4
|
class SCALE < CDK::CDKOBJS
|
@@ -37,7 +37,7 @@ module CDK
|
|
37
37
|
# Translate the label string to a chtype array
|
38
38
|
unless label.nil?
|
39
39
|
label_len = []
|
40
|
-
@label =
|
40
|
+
@label = char2Chtype(label, label_len, [])
|
41
41
|
@label_len = label_len[0]
|
42
42
|
box_width = @label_len + field_width + 2
|
43
43
|
end
|
@@ -57,7 +57,7 @@ module CDK
|
|
57
57
|
# Rejustify the x and y positions if we need to.
|
58
58
|
xtmp = [xplace]
|
59
59
|
ytmp = [yplace]
|
60
|
-
|
60
|
+
alignxy(cdkscreen.window, xtmp, ytmp, box_width, box_height)
|
61
61
|
xpos = xtmp[0]
|
62
62
|
ypos = ytmp[0]
|
63
63
|
|
@@ -286,7 +286,7 @@ module CDK
|
|
286
286
|
def inject(input)
|
287
287
|
pp_return = 1
|
288
288
|
ret = -1
|
289
|
-
complete = false
|
289
|
+
@complete = false
|
290
290
|
|
291
291
|
# Set the exit type.
|
292
292
|
self.setExitType(0)
|
@@ -305,7 +305,7 @@ module CDK
|
|
305
305
|
if pp_return != 0
|
306
306
|
# Check for a key bindings.
|
307
307
|
if self.checkBind(self.object_type, input)
|
308
|
-
complete = true
|
308
|
+
@complete = true
|
309
309
|
else
|
310
310
|
case input
|
311
311
|
when Ncurses::KEY_LEFT
|
@@ -327,13 +327,13 @@ module CDK
|
|
327
327
|
when CDK::KEY_TAB, CDK::KEY_RETURN, Ncurses::KEY_ENTER
|
328
328
|
self.setExitType(input)
|
329
329
|
ret = @current
|
330
|
-
complete = true
|
330
|
+
@complete = true
|
331
331
|
when CDK::KEY_ESC
|
332
332
|
self.setExitType(input)
|
333
|
-
complete = true
|
333
|
+
@complete = true
|
334
334
|
when Ncurses::ERR
|
335
335
|
self.setExitType(input)
|
336
|
-
complete = true
|
336
|
+
@complete = true
|
337
337
|
when CDK::REFRESH
|
338
338
|
@screen.erase
|
339
339
|
@screen.refresh
|
@@ -363,13 +363,13 @@ module CDK
|
|
363
363
|
self.limitCurrentValue
|
364
364
|
|
365
365
|
# Should we call a post-process?
|
366
|
-
if
|
366
|
+
if !@complete && !(@post_process_func).nil?
|
367
367
|
@post_process_func.call(self.object_type, self,
|
368
368
|
@post_process_data, input)
|
369
369
|
end
|
370
370
|
end
|
371
371
|
|
372
|
-
if
|
372
|
+
if !@complete
|
373
373
|
self.drawField
|
374
374
|
self.setExitType(0)
|
375
375
|
end
|
@@ -403,9 +403,9 @@ module CDK
|
|
403
403
|
unless @label_win.nil?
|
404
404
|
Draw.writeChtype(@label_win, 0, 0, @label, CDK::HORIZONTAL,
|
405
405
|
0, @label_len)
|
406
|
-
@label_win
|
406
|
+
wrefresh(@label_win)
|
407
407
|
end
|
408
|
-
|
408
|
+
wrefresh
|
409
409
|
|
410
410
|
# Draw the field window.
|
411
411
|
self.drawField
|
@@ -422,7 +422,7 @@ module CDK
|
|
422
422
|
CDK::HORIZONTAL, 0, temp.size)
|
423
423
|
|
424
424
|
self.moveToEditPosition(@field_edit)
|
425
|
-
@field_win
|
425
|
+
wrefresh(@field_win)
|
426
426
|
end
|
427
427
|
|
428
428
|
# This sets the background attribute of teh widget.
|
@@ -2,6 +2,8 @@ require_relative 'scroller'
|
|
2
2
|
|
3
3
|
module CDK
|
4
4
|
class SCROLL < CDK::SCROLLER
|
5
|
+
include CommonControls
|
6
|
+
|
5
7
|
attr_reader :item, :list_size, :current_item, :highlight
|
6
8
|
|
7
9
|
def initialize (cdkscreen, xplace, yplace, splace, height, width, title,
|
@@ -64,7 +66,7 @@ module CDK
|
|
64
66
|
# Rejustify the x and y positions if we need to.
|
65
67
|
xtmp = [xpos]
|
66
68
|
ytmp = [ypos]
|
67
|
-
|
69
|
+
alignxy(cdkscreen.window, xtmp, ytmp, @box_width, @box_height)
|
68
70
|
xpos = xtmp[0]
|
69
71
|
ypos = ytmp[0]
|
70
72
|
|
@@ -148,7 +150,7 @@ module CDK
|
|
148
150
|
xpos = self.SCREEN_XPOS(0) + scrollbar_adj
|
149
151
|
|
150
152
|
@input_window.wmove(ypos, xpos)
|
151
|
-
@input_window
|
153
|
+
wrefresh(@input_window)
|
152
154
|
end
|
153
155
|
|
154
156
|
# This actually does all the 'real' work of managing the scrolling list.
|
@@ -186,7 +188,7 @@ module CDK
|
|
186
188
|
def inject(input)
|
187
189
|
pp_return = 1
|
188
190
|
ret = -1
|
189
|
-
complete = false
|
191
|
+
@complete = false
|
190
192
|
|
191
193
|
# Set the exit type for the widget.
|
192
194
|
self.setExitType(0)
|
@@ -205,7 +207,7 @@ module CDK
|
|
205
207
|
# Check for a predefined key binding.
|
206
208
|
if self.checkBind(:SCROLL, input) != false
|
207
209
|
#self.checkEarlyExit
|
208
|
-
complete = true
|
210
|
+
@complete = true
|
209
211
|
else
|
210
212
|
case input
|
211
213
|
when Ncurses::KEY_UP
|
@@ -230,26 +232,28 @@ module CDK
|
|
230
232
|
@left_char = 0
|
231
233
|
when CDK::KEY_ESC
|
232
234
|
self.setExitType(input)
|
233
|
-
complete = true
|
235
|
+
@complete = true
|
234
236
|
when Ncurses::ERR
|
235
237
|
self.setExitType(input)
|
236
|
-
complete = true
|
238
|
+
@complete = true
|
237
239
|
when CDK::REFRESH
|
238
240
|
@screen.erase
|
239
241
|
@screen.refresh
|
240
242
|
when CDK::KEY_TAB, Ncurses::KEY_ENTER, CDK::KEY_RETURN
|
241
|
-
|
242
|
-
|
243
|
-
|
243
|
+
if quit_on_enter?
|
244
|
+
self.setExitType(input)
|
245
|
+
ret = @current_item
|
246
|
+
@complete = true
|
247
|
+
end
|
244
248
|
end
|
245
249
|
end
|
246
250
|
|
247
|
-
if
|
251
|
+
if !@complete && !(@post_process_func.nil?)
|
248
252
|
@post_process_func.call(:SCROLL, self, @post_process_data, input)
|
249
253
|
end
|
250
254
|
end
|
251
255
|
|
252
|
-
if
|
256
|
+
if !@complete
|
253
257
|
self.drawList(@box)
|
254
258
|
self.setExitType(0)
|
255
259
|
end
|
@@ -361,7 +365,7 @@ module CDK
|
|
361
365
|
end
|
362
366
|
|
363
367
|
# Refresh the window
|
364
|
-
|
368
|
+
wrefresh
|
365
369
|
end
|
366
370
|
|
367
371
|
# This sets the background attribute of the widget.
|
@@ -422,11 +426,11 @@ module CDK
|
|
422
426
|
|
423
427
|
item_len = []
|
424
428
|
item_pos = []
|
425
|
-
@item[which] =
|
429
|
+
@item[which] = char2Chtype(value, item_len, item_pos)
|
426
430
|
@item_len[which] = item_len[0]
|
427
431
|
@item_pos[which] = item_pos[0]
|
428
432
|
|
429
|
-
@item_pos[which] =
|
433
|
+
@item_pos[which] = justify_string(@box_width,
|
430
434
|
@item_len[which], @item_pos[which])
|
431
435
|
return true
|
432
436
|
end
|
@@ -492,7 +496,7 @@ module CDK
|
|
492
496
|
|
493
497
|
def getItems(list)
|
494
498
|
(0...@list_size).each do |x|
|
495
|
-
list <<
|
499
|
+
list << chtype2Char(@item[x])
|
496
500
|
end
|
497
501
|
|
498
502
|
return @list_size
|
@@ -601,12 +605,12 @@ module CDK
|
|
601
605
|
|
602
606
|
def focus
|
603
607
|
self.drawCurrent
|
604
|
-
@list_win
|
608
|
+
wrefresh(@list_win)
|
605
609
|
end
|
606
610
|
|
607
611
|
def unfocus
|
608
612
|
self.drawCurrent
|
609
|
-
@list_win
|
613
|
+
wrefresh(@list_win)
|
610
614
|
end
|
611
615
|
|
612
616
|
def AvailableWidth
|
@@ -623,372 +627,5 @@ module CDK
|
|
623
627
|
def WidestItem
|
624
628
|
@max_left_char + self.AvailableWidth
|
625
629
|
end
|
626
|
-
end
|
627
|
-
|
628
|
-
class BUTTON < CDK::CDKOBJS
|
629
|
-
def initialize(cdkscreen, xplace, yplace, text, callback, box, shadow)
|
630
|
-
super()
|
631
|
-
parent_width = cdkscreen.window.getmaxx
|
632
|
-
parent_height = cdkscreen.window.getmaxy
|
633
|
-
box_width = 0
|
634
|
-
xpos = xplace
|
635
|
-
ypos = yplace
|
636
|
-
|
637
|
-
self.setBox(box)
|
638
|
-
box_height = 1 + 2 * @border_size
|
639
|
-
|
640
|
-
# Translate the string to a chtype array.
|
641
|
-
info_len = []
|
642
|
-
info_pos = []
|
643
|
-
@info = CDK.char2Chtype(text, info_len, info_pos)
|
644
|
-
@info_len = info_len[0]
|
645
|
-
@info_pos = info_pos[0]
|
646
|
-
box_width = [box_width, @info_len].max + 2 * @border_size
|
647
|
-
|
648
|
-
# Create the string alignments.
|
649
|
-
@info_pos = CDK.justifyString(box_width - 2 * @border_size,
|
650
|
-
@info_len, @info_pos)
|
651
|
-
|
652
|
-
# Make sure we didn't extend beyond the dimensions of the window.
|
653
|
-
box_width = if box_width > parent_width
|
654
|
-
then parent_width
|
655
|
-
else box_width
|
656
|
-
end
|
657
|
-
box_height = if box_height > parent_height
|
658
|
-
then parent_height
|
659
|
-
else box_height
|
660
|
-
end
|
661
|
-
|
662
|
-
# Rejustify the x and y positions if we need to.
|
663
|
-
xtmp = [xpos]
|
664
|
-
ytmp = [ypos]
|
665
|
-
CDK.alignxy(cdkscreen.window, xtmp, ytmp, box_width, box_height)
|
666
|
-
xpos = xtmp[0]
|
667
|
-
ypos = ytmp[0]
|
668
|
-
|
669
|
-
# Create the button.
|
670
|
-
@screen = cdkscreen
|
671
|
-
# ObjOf (button)->fn = &my_funcs;
|
672
|
-
@parent = cdkscreen.window
|
673
|
-
@win = Ncurses::WINDOW.new(box_height, box_width, ypos, xpos)
|
674
|
-
@shadow_win = nil
|
675
|
-
@xpos = xpos
|
676
|
-
@ypos = ypos
|
677
|
-
@box_width = box_width
|
678
|
-
@box_height = box_height
|
679
|
-
@callback = callback
|
680
|
-
@input_window = @win
|
681
|
-
@accepts_focus = true
|
682
|
-
@shadow = shadow
|
683
|
-
|
684
|
-
if @win.nil?
|
685
|
-
self.destroy
|
686
|
-
return nil
|
687
|
-
end
|
688
|
-
|
689
|
-
@win.keypad(true)
|
690
|
-
|
691
|
-
# If a shadow was requested, then create the shadow window.
|
692
|
-
if shadow
|
693
|
-
@shadow_win = Ncurses::WINDOW.new(box_height, box_width,
|
694
|
-
ypos + 1, xpos + 1)
|
695
|
-
end
|
696
|
-
|
697
|
-
# Register this baby.
|
698
|
-
cdkscreen.register(:BUTTON, self)
|
699
|
-
end
|
700
|
-
|
701
|
-
# This was added for the builder.
|
702
|
-
def activate(actions)
|
703
|
-
self.draw(@box)
|
704
|
-
ret = -1
|
705
|
-
|
706
|
-
if actions.nil? || actions.size == 0
|
707
|
-
while true
|
708
|
-
input = self.getch([])
|
709
|
-
|
710
|
-
# Inject the character into the widget.
|
711
|
-
ret = self.inject(input)
|
712
|
-
if @exit_type != :EARLY_EXIT
|
713
|
-
return ret
|
714
|
-
end
|
715
|
-
end
|
716
|
-
else
|
717
|
-
# Inject each character one at a time.
|
718
|
-
actions.each do |x|
|
719
|
-
ret = self.inject(action)
|
720
|
-
if @exit_type == :EARLY_EXIT
|
721
|
-
return ret
|
722
|
-
end
|
723
|
-
end
|
724
|
-
end
|
725
|
-
|
726
|
-
# Set the exit type and exit
|
727
|
-
self.setExitType(0)
|
728
|
-
return -1
|
729
|
-
end
|
730
|
-
|
731
|
-
# This sets multiple attributes of the widget.
|
732
|
-
def set(mesg, box)
|
733
|
-
self.setMessage(mesg)
|
734
|
-
self.setBox(box)
|
735
|
-
end
|
736
|
-
|
737
|
-
# This sets the information within the button.
|
738
|
-
def setMessage(info)
|
739
|
-
info_len = []
|
740
|
-
info_pos = []
|
741
|
-
@info = CDK.char2Chtype(info, info_len, info_pos)
|
742
|
-
@info_len = info_len[0]
|
743
|
-
@info_pos = CDK.justifyString(@box_width - 2 * @border_size,
|
744
|
-
info_pos[0])
|
745
|
-
|
746
|
-
# Redraw the button widget.
|
747
|
-
self.erase
|
748
|
-
self.draw(box)
|
749
|
-
end
|
750
|
-
|
751
|
-
def getMessage
|
752
|
-
return @info
|
753
|
-
end
|
754
|
-
|
755
|
-
# This sets the background attribute of the widget.
|
756
|
-
def setBKattr(attrib)
|
757
|
-
@win.wbkgd(attrib)
|
758
|
-
end
|
759
|
-
|
760
|
-
def drawText
|
761
|
-
box_width = @box_width
|
762
|
-
|
763
|
-
# Draw in the message.
|
764
|
-
(0...(box_width - 2 * @border_size)).each do |i|
|
765
|
-
pos = @info_pos
|
766
|
-
len = @info_len
|
767
|
-
if i >= pos && (i - pos) < len
|
768
|
-
c = @info[i - pos]
|
769
|
-
else
|
770
|
-
c = ' '
|
771
|
-
end
|
772
|
-
|
773
|
-
if @has_focus
|
774
|
-
c = Ncurses::A_REVERSE | c
|
775
|
-
end
|
776
|
-
|
777
|
-
@win.mvwaddch(@border_size, i + @border_size, c)
|
778
|
-
end
|
779
|
-
end
|
780
|
-
|
781
|
-
# This draws the button widget
|
782
|
-
def draw(box)
|
783
|
-
# Is there a shadow?
|
784
|
-
unless @shadow_win.nil?
|
785
|
-
Draw.drawShadow(@shadow_win)
|
786
|
-
end
|
787
|
-
|
788
|
-
# Box the widget if asked.
|
789
|
-
if @box
|
790
|
-
Draw.drawObjBox(@win, self)
|
791
|
-
end
|
792
|
-
self.drawText
|
793
|
-
@win.wrefresh
|
794
|
-
end
|
795
|
-
|
796
|
-
# This erases the button widget.
|
797
|
-
def erase
|
798
|
-
if self.validCDKObject
|
799
|
-
CDK.eraseCursesWindow(@win)
|
800
|
-
CDK.eraseCursesWindow(@shadow_win)
|
801
|
-
end
|
802
|
-
end
|
803
|
-
|
804
|
-
# This moves the button field to the given location.
|
805
|
-
def move(xplace, yplace, relative, refresh_flag)
|
806
|
-
current_x = @win.getbegx
|
807
|
-
current_y = @win.getbegy
|
808
|
-
xpos = xplace
|
809
|
-
ypos = yplace
|
810
|
-
|
811
|
-
# If this is a relative move, then we will adjust where we want
|
812
|
-
# to move to.
|
813
|
-
if relative
|
814
|
-
xpos = @win.getbegx + xplace
|
815
|
-
ypos = @win.getbegy + yplace
|
816
|
-
end
|
817
|
-
|
818
|
-
# Adjust the window if we need to.
|
819
|
-
xtmp = [xpos]
|
820
|
-
ytmp = [ypos]
|
821
|
-
CDK.alignxy(@screen.window, xtmp, ytmp, @box_width, @box_height)
|
822
|
-
xpos = xtmp[0]
|
823
|
-
ypos = ytmp[0]
|
824
|
-
|
825
|
-
# Get the difference
|
826
|
-
xdiff = current_x - xpos
|
827
|
-
ydiff = current_y - ypos
|
828
|
-
|
829
|
-
# Move the window to the new location.
|
830
|
-
CDK.moveCursesWindow(@win, -xdiff, -ydiff)
|
831
|
-
CDK.moveCursesWindow(@shadow_win, -xdiff, -ydiff)
|
832
|
-
|
833
|
-
# Thouch the windows so they 'move'.
|
834
|
-
CDK::SCREEN.refreshCDKWindow(@screen.window)
|
835
|
-
|
836
|
-
# Redraw the window, if they asked for it.
|
837
|
-
if refresh_flag
|
838
|
-
self.draw(@box)
|
839
|
-
end
|
840
|
-
end
|
841
|
-
|
842
|
-
# This allows the user to use the cursor keys to adjust the
|
843
|
-
# position of the widget.
|
844
|
-
def position
|
845
|
-
# Declare some variables
|
846
|
-
orig_x = @win.getbegx
|
847
|
-
orig_y = @win.getbegy
|
848
|
-
key = 0
|
849
|
-
|
850
|
-
# Let them move the widget around until they hit return
|
851
|
-
while key != Ncurses::KEY_ENTER && key != CDK::KEY_RETURN
|
852
|
-
key = self.getch([])
|
853
|
-
if key == Ncurses::KEY_UP || key == '8'.ord
|
854
|
-
if @win.getbegy > 0
|
855
|
-
self.move(0, -1, true, true)
|
856
|
-
else
|
857
|
-
CDK.Beep
|
858
|
-
end
|
859
|
-
elsif key == Ncurses::KEY_DOWN || key == '2'.ord
|
860
|
-
if @win.getbegy + @win.getmaxy < @screen.window.getmaxy - 1
|
861
|
-
self.move(0, 1, true, true)
|
862
|
-
else
|
863
|
-
CDK.Beep
|
864
|
-
end
|
865
|
-
elsif key == Ncurses::KEY_LEFT || key == '4'.ord
|
866
|
-
if @win.getbegx > 0
|
867
|
-
self.move(-1, 0, true, true)
|
868
|
-
else
|
869
|
-
CDK.Beep
|
870
|
-
end
|
871
|
-
elsif key == Ncurses::KEY_RIGHT || key == '6'.ord
|
872
|
-
if @win.getbegx + @win.getmaxx < @screen.window.getmaxx - 1
|
873
|
-
self.move(1, 0, true, true)
|
874
|
-
else
|
875
|
-
CDK.Beep
|
876
|
-
end
|
877
|
-
elsif key == '7'.ord
|
878
|
-
if @win.getbegy > 0 && @win.getbegx > 0
|
879
|
-
self.move(-1, -1, true, true)
|
880
|
-
else
|
881
|
-
CDK.Beep
|
882
|
-
end
|
883
|
-
elsif key == '9'.ord
|
884
|
-
if @win.getbegx + @win.getmaxx < @screen.window.getmaxx - 1 &&
|
885
|
-
@win.getbegy > 0
|
886
|
-
self.move(1, -1, true, true)
|
887
|
-
else
|
888
|
-
CDK.Beep
|
889
|
-
end
|
890
|
-
elsif key == '1'.ord
|
891
|
-
if @win.getbegx > 0 &&
|
892
|
-
@win.getbegx + @win.getmaxx < @screen.window.getmaxx - 1
|
893
|
-
self.move(-1, 1, true, true)
|
894
|
-
else
|
895
|
-
CDK.Beep
|
896
|
-
end
|
897
|
-
elsif key == '3'.ord
|
898
|
-
if @win.getbegx + @win.getmaxx < @screen.window.getmaxx - 1 &&
|
899
|
-
@win.getbegy + @win.getmaxy < @screen.window.getmaxy - 1
|
900
|
-
self.move(1, 1, true, true)
|
901
|
-
else
|
902
|
-
CDK.Beep
|
903
|
-
end
|
904
|
-
elsif key == '5'.ord
|
905
|
-
self.move(CDK::CENTER, CDK::CENTER, false, true)
|
906
|
-
elsif key == 't'.ord
|
907
|
-
self.move(@win.getbegx, CDK::TOP, false, true)
|
908
|
-
elsif key == 'b'.ord
|
909
|
-
self.move(@win.getbegx, CDK::BOTTOM, false, true)
|
910
|
-
elsif key == 'l'.ord
|
911
|
-
self.move(CDK::LEFT, @win.getbegy, false, true)
|
912
|
-
elsif key == 'r'
|
913
|
-
self.move(CDK::RIGHT, @win.getbegy, false, true)
|
914
|
-
elsif key == 'c'
|
915
|
-
self.move(CDK::CENTER, @win.getbegy, false, true)
|
916
|
-
elsif key == 'C'
|
917
|
-
self.move(@win.getbegx, CDK::CENTER, false, true)
|
918
|
-
elsif key == CDK::REFRESH
|
919
|
-
@screen.erase
|
920
|
-
@screen.refresh
|
921
|
-
elsif key == CDK::KEY_ESC
|
922
|
-
self.move(orig_x, orig_y, false, true)
|
923
|
-
elsif key != CDK::KEY_RETURN && key != Ncurses::KEY_ENTER
|
924
|
-
CDK.Beep
|
925
|
-
end
|
926
|
-
end
|
927
|
-
end
|
928
|
-
|
929
|
-
# This destroys the button object pointer.
|
930
|
-
def destroy
|
931
|
-
CDK.deleteCursesWindow(@shadow_win)
|
932
|
-
CDK.deleteCursesWindow(@win)
|
933
|
-
|
934
|
-
self.cleanBindings(:BUTTON)
|
935
|
-
|
936
|
-
CDK::SCREEN.unregister(:BUTTON, self)
|
937
|
-
end
|
938
|
-
|
939
|
-
# This injects a single character into the widget.
|
940
|
-
def inject(input)
|
941
|
-
ret = -1
|
942
|
-
complete = false
|
943
|
-
|
944
|
-
self.setExitType(0)
|
945
|
-
|
946
|
-
# Check a predefined binding.
|
947
|
-
if self.checkBind(:BUTTON, input)
|
948
|
-
complete = true
|
949
|
-
else
|
950
|
-
case input
|
951
|
-
when CDK::KEY_ESC
|
952
|
-
self.setExitType(input)
|
953
|
-
complete = true
|
954
|
-
when Ncurses::ERR
|
955
|
-
self.setExitType(input)
|
956
|
-
complete = true
|
957
|
-
when ' '.ord, CDK::KEY_RETURN, Ncurses::KEY_ENTER
|
958
|
-
unless @callback.nil?
|
959
|
-
@callback.call(self)
|
960
|
-
end
|
961
|
-
self.setExitType(Ncurses::KEY_ENTER)
|
962
|
-
ret = 0
|
963
|
-
complete = true
|
964
|
-
when CDK::REFRESH
|
965
|
-
@screen.erase
|
966
|
-
@screen.refresh
|
967
|
-
else
|
968
|
-
CDK.Beep
|
969
|
-
end
|
970
|
-
end
|
971
|
-
|
972
|
-
unless complete
|
973
|
-
self.setExitType(0)
|
974
|
-
end
|
975
|
-
|
976
|
-
@result_data = ret
|
977
|
-
return ret
|
978
|
-
end
|
979
|
-
|
980
|
-
def focus
|
981
|
-
self.drawText
|
982
|
-
@win.wrefresh
|
983
|
-
end
|
984
|
-
|
985
|
-
def unfocus
|
986
|
-
self.drawText
|
987
|
-
@win.wrefresh
|
988
|
-
end
|
989
|
-
|
990
|
-
def object_type
|
991
|
-
:BUTTON
|
992
|
-
end
|
993
|
-
end
|
994
|
-
end
|
630
|
+
end # class SCROLL
|
631
|
+
end # module CDK
|