cdk 0.9.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.
- checksums.yaml +7 -0
- data/lib/cdk.rb +916 -0
- data/lib/cdk/alphalist.rb +562 -0
- data/lib/cdk/buttonbox.rb +354 -0
- data/lib/cdk/calendar.rb +770 -0
- data/lib/cdk/cdk_objs.rb +463 -0
- data/lib/cdk/dialog.rb +727 -0
- data/lib/cdk/display.rb +63 -0
- data/lib/cdk/draw.rb +233 -0
- data/lib/cdk/dscale.rb +13 -0
- data/lib/cdk/entry.rb +556 -0
- data/lib/cdk/fscale.rb +44 -0
- data/lib/cdk/fselect.rb +940 -0
- data/lib/cdk/fslider.rb +61 -0
- data/lib/cdk/histogram.rb +410 -0
- data/lib/cdk/itemlist.rb +475 -0
- data/lib/cdk/label.rb +207 -0
- data/lib/cdk/marquee.rb +241 -0
- data/lib/cdk/matrix.rb +1176 -0
- data/lib/cdk/mentry.rb +614 -0
- data/lib/cdk/menu.rb +448 -0
- data/lib/cdk/radio.rb +533 -0
- data/lib/cdk/scale.rb +525 -0
- data/lib/cdk/screen.rb +280 -0
- data/lib/cdk/scroll.rb +994 -0
- data/lib/cdk/scroller.rb +183 -0
- data/lib/cdk/selection.rb +619 -0
- data/lib/cdk/slider.rb +541 -0
- data/lib/cdk/swindow.rb +762 -0
- data/lib/cdk/template.rb +562 -0
- data/lib/cdk/traverse.rb +289 -0
- data/lib/cdk/uscale.rb +14 -0
- data/lib/cdk/uslider.rb +14 -0
- data/lib/cdk/viewer.rb +812 -0
- metadata +91 -0
data/lib/cdk/cdk_objs.rb
ADDED
@@ -0,0 +1,463 @@
|
|
1
|
+
module CDK
|
2
|
+
class CDKOBJS
|
3
|
+
attr_accessor :screen_index, :screen, :has_focus, :is_visible, :box
|
4
|
+
attr_accessor :ULChar, :URChar, :LLChar, :LRChar, :HZChar, :VTChar, :BXAttr
|
5
|
+
attr_reader :binding_list, :accepts_focus, :exit_type, :border_size
|
6
|
+
|
7
|
+
@@g_paste_buffer = ''
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@has_focus = true
|
11
|
+
@is_visible = true
|
12
|
+
|
13
|
+
CDK::ALL_OBJECTS << self
|
14
|
+
|
15
|
+
# set default line-drawing characters
|
16
|
+
@ULChar = Ncurses::ACS_ULCORNER
|
17
|
+
@URChar = Ncurses::ACS_URCORNER
|
18
|
+
@LLChar = Ncurses::ACS_LLCORNER
|
19
|
+
@LRChar = Ncurses::ACS_LRCORNER
|
20
|
+
@HZChar = Ncurses::ACS_HLINE
|
21
|
+
@VTChar = Ncurses::ACS_VLINE
|
22
|
+
@BXAttr = Ncurses::A_NORMAL
|
23
|
+
|
24
|
+
# set default exit-types
|
25
|
+
@exit_type = :NEVER_ACTIVATED
|
26
|
+
@early_exit = :NEVER_ACTIVATED
|
27
|
+
|
28
|
+
@accepts_focus = false
|
29
|
+
|
30
|
+
# Bound functions
|
31
|
+
@binding_list = {}
|
32
|
+
end
|
33
|
+
|
34
|
+
def object_type
|
35
|
+
# no type by default
|
36
|
+
:NULL
|
37
|
+
end
|
38
|
+
|
39
|
+
def validObjType(type)
|
40
|
+
# dummy version for now
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
def SCREEN_XPOS(n)
|
45
|
+
n + @border_size
|
46
|
+
end
|
47
|
+
|
48
|
+
def SCREEN_YPOS(n)
|
49
|
+
n + @border_size + @title_lines
|
50
|
+
end
|
51
|
+
|
52
|
+
def draw(a)
|
53
|
+
end
|
54
|
+
|
55
|
+
def erase
|
56
|
+
end
|
57
|
+
|
58
|
+
def move(xplace, yplace, relative, refresh_flag)
|
59
|
+
self.move_specific(xplace, yplace, relative, refresh_flag,
|
60
|
+
[@win, @shadow_win], [])
|
61
|
+
end
|
62
|
+
|
63
|
+
def move_specific(xplace, yplace, relative, refresh_flag,
|
64
|
+
windows, subwidgets)
|
65
|
+
current_x = @win.getbegx
|
66
|
+
current_y = @win.getbegy
|
67
|
+
xpos = xplace
|
68
|
+
ypos = yplace
|
69
|
+
|
70
|
+
# If this is a relative move, then we will adjust where we want
|
71
|
+
# to move to.
|
72
|
+
if relative
|
73
|
+
xpos = @win.getbegx + xplace
|
74
|
+
ypos = @win.getbegy + yplace
|
75
|
+
end
|
76
|
+
|
77
|
+
# Adjust the window if we need to
|
78
|
+
xtmp = [xpos]
|
79
|
+
ytmp = [ypos]
|
80
|
+
CDK.alignxy(@screen.window, xtmp, ytmp, @box_width, @box_height)
|
81
|
+
xpos = xtmp[0]
|
82
|
+
ypos = ytmp[0]
|
83
|
+
|
84
|
+
# Get the difference
|
85
|
+
xdiff = current_x - xpos
|
86
|
+
ydiff = current_y - ypos
|
87
|
+
|
88
|
+
# Move the window to the new location.
|
89
|
+
windows.each do |window|
|
90
|
+
CDK.moveCursesWindow(window, -xdiff, -ydiff)
|
91
|
+
end
|
92
|
+
|
93
|
+
subwidgets.each do |subwidget|
|
94
|
+
subwidget.move(xplace, yplace, relative, false)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Touch the windows so they 'move'
|
98
|
+
CDK::SCREEN.refreshCDKWindow(@screen.window)
|
99
|
+
|
100
|
+
# Redraw the window, if they asked for it
|
101
|
+
if refresh_flag
|
102
|
+
self.draw(@box)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def inject(a)
|
107
|
+
end
|
108
|
+
|
109
|
+
def setBox(box)
|
110
|
+
@box = box
|
111
|
+
@border_size = if @box then 1 else 0 end
|
112
|
+
end
|
113
|
+
|
114
|
+
def getBox
|
115
|
+
return @box
|
116
|
+
end
|
117
|
+
|
118
|
+
def focus
|
119
|
+
end
|
120
|
+
|
121
|
+
def unfocus
|
122
|
+
end
|
123
|
+
|
124
|
+
def saveData
|
125
|
+
end
|
126
|
+
|
127
|
+
def refreshData
|
128
|
+
end
|
129
|
+
|
130
|
+
def destroy
|
131
|
+
end
|
132
|
+
|
133
|
+
# Set the object's upper-left-corner line-drawing character.
|
134
|
+
def setULchar(ch)
|
135
|
+
@ULChar = ch
|
136
|
+
end
|
137
|
+
|
138
|
+
# Set the object's upper-right-corner line-drawing character.
|
139
|
+
def setURchar(ch)
|
140
|
+
@URChar = ch
|
141
|
+
end
|
142
|
+
|
143
|
+
# Set the object's lower-left-corner line-drawing character.
|
144
|
+
def setLLchar(ch)
|
145
|
+
@LLChar = ch
|
146
|
+
end
|
147
|
+
|
148
|
+
# Set the object's upper-right-corner line-drawing character.
|
149
|
+
def setLRchar(ch)
|
150
|
+
@LRChar = ch
|
151
|
+
end
|
152
|
+
|
153
|
+
# Set the object's horizontal line-drawing character
|
154
|
+
def setHZchar(ch)
|
155
|
+
@HZChar = ch
|
156
|
+
end
|
157
|
+
|
158
|
+
# Set the object's vertical line-drawing character
|
159
|
+
def setVTchar(ch)
|
160
|
+
@VTChar = ch
|
161
|
+
end
|
162
|
+
|
163
|
+
# Set the object's box-attributes.
|
164
|
+
def setBXattr(ch)
|
165
|
+
@BXAttr = ch
|
166
|
+
end
|
167
|
+
|
168
|
+
# This sets the background color of the widget.
|
169
|
+
def setBackgroundColor(color)
|
170
|
+
return if color.nil? || color == ''
|
171
|
+
|
172
|
+
junk1 = []
|
173
|
+
junk2 = []
|
174
|
+
|
175
|
+
# Convert the value of the environment variable to a chtype
|
176
|
+
holder = CDK.char2Chtype(color, junk1, junk2)
|
177
|
+
|
178
|
+
# Set the widget's background color
|
179
|
+
self.setBKattr(holder[0])
|
180
|
+
end
|
181
|
+
|
182
|
+
# Set the widget's title.
|
183
|
+
def setTitle (title, box_width)
|
184
|
+
if !title.nil?
|
185
|
+
temp = title.split("\n")
|
186
|
+
@title_lines = temp.size
|
187
|
+
|
188
|
+
if box_width >= 0
|
189
|
+
max_width = 0
|
190
|
+
temp.each do |line|
|
191
|
+
len = []
|
192
|
+
align = []
|
193
|
+
holder = CDK.char2Chtype(line, len, align)
|
194
|
+
max_width = [len[0], max_width].max
|
195
|
+
end
|
196
|
+
box_width = [box_width, max_width + 2 * @border_size].max
|
197
|
+
else
|
198
|
+
box_width = -(box_width - 1)
|
199
|
+
end
|
200
|
+
|
201
|
+
# For each line in the title convert from string to chtype array
|
202
|
+
title_width = box_width - (2 * @border_size)
|
203
|
+
@title = []
|
204
|
+
@title_pos = []
|
205
|
+
@title_len = []
|
206
|
+
(0...@title_lines).each do |x|
|
207
|
+
len_x = []
|
208
|
+
pos_x = []
|
209
|
+
@title << CDK.char2Chtype(temp[x], len_x, pos_x)
|
210
|
+
@title_len.concat(len_x)
|
211
|
+
@title_pos << CDK.justifyString(title_width, len_x[0], pos_x[0])
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
return box_width
|
216
|
+
end
|
217
|
+
|
218
|
+
# Draw the widget's title
|
219
|
+
def drawTitle(win)
|
220
|
+
(0...@title_lines).each do |x|
|
221
|
+
Draw.writeChtype(@win, @title_pos[x] + @border_size,
|
222
|
+
x + @border_size, @title[x], CDK::HORIZONTAL, 0,
|
223
|
+
@title_len[x])
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Remove storage for the widget's title.
|
228
|
+
def cleanTitle
|
229
|
+
@title_lines = ''
|
230
|
+
end
|
231
|
+
|
232
|
+
# Set data for preprocessing
|
233
|
+
def setPreProcess (fn, data)
|
234
|
+
@pre_process_func = fn
|
235
|
+
@pre_process_data = data
|
236
|
+
end
|
237
|
+
|
238
|
+
# Set data for postprocessing
|
239
|
+
def setPostProcess (fn, data)
|
240
|
+
@post_process_func = fn
|
241
|
+
@post_process_data = data
|
242
|
+
end
|
243
|
+
|
244
|
+
# Set the object's exit-type based on the input.
|
245
|
+
# The .exitType field should have been part of the CDKOBJS struct, but it
|
246
|
+
# is used too pervasively in older applications to move (yet).
|
247
|
+
def setExitType(ch)
|
248
|
+
case ch
|
249
|
+
when Ncurses::ERR
|
250
|
+
@exit_type = :ERROR
|
251
|
+
when CDK::KEY_ESC
|
252
|
+
@exit_type = :ESCAPE_HIT
|
253
|
+
when CDK::KEY_TAB, Ncurses::KEY_ENTER, CDK::KEY_RETURN
|
254
|
+
@exit_type = :NORMAL
|
255
|
+
when 0
|
256
|
+
@exit_type = :EARLY_EXIT
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def validCDKObject
|
261
|
+
result = false
|
262
|
+
if CDK::ALL_OBJECTS.include?(self)
|
263
|
+
result = self.validObjType(self.object_type)
|
264
|
+
end
|
265
|
+
return result
|
266
|
+
end
|
267
|
+
|
268
|
+
def getc
|
269
|
+
cdktype = self.object_type
|
270
|
+
test = self.bindableObject(cdktype)
|
271
|
+
result = @input_window.wgetch
|
272
|
+
|
273
|
+
if result >= 0 && !(test.nil?) && test.binding_list.include?(result) &&
|
274
|
+
test.binding_list[result][0] == :getc
|
275
|
+
result = test.binding_list[result][1]
|
276
|
+
elsif test.nil? || !(test.binding_list.include?(result)) ||
|
277
|
+
test.binding_list[result][0].nil?
|
278
|
+
case result
|
279
|
+
when "\r".ord, "\n".ord
|
280
|
+
result = Ncurses::KEY_ENTER
|
281
|
+
when "\t".ord
|
282
|
+
result = CDK::KEY_TAB
|
283
|
+
when CDK::DELETE
|
284
|
+
result = Ncurses::KEY_DC
|
285
|
+
when "\b".ord
|
286
|
+
result = Ncurses::KEY_BACKSPACE
|
287
|
+
when CDK::BEGOFLINE
|
288
|
+
result = Ncurses::KEY_HOME
|
289
|
+
when CDK::ENDOFLINE
|
290
|
+
result = Ncurses::KEY_END
|
291
|
+
when CDK::FORCHAR
|
292
|
+
result = Ncurses::KEY_RIGHT
|
293
|
+
when CDK::BACKCHAR
|
294
|
+
result = Ncurses::KEY_LEFT
|
295
|
+
when CDK::NEXT
|
296
|
+
result = CDK::KEY_TAB
|
297
|
+
when CDK::PREV
|
298
|
+
result = Ncurses::KEY_BTAB
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
return result
|
303
|
+
end
|
304
|
+
|
305
|
+
def getch(function_key)
|
306
|
+
key = self.getc
|
307
|
+
function_key << (key >= Ncurses::KEY_MIN && key <= Ncurses::KEY_MAX)
|
308
|
+
return key
|
309
|
+
end
|
310
|
+
|
311
|
+
def bindableObject(cdktype)
|
312
|
+
if cdktype != self.object_type
|
313
|
+
return nil
|
314
|
+
elsif [:FSELECT, :ALPHALIST].include?(self.object_type)
|
315
|
+
return @entry_field
|
316
|
+
else
|
317
|
+
return self
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def bind(type, key, function, data)
|
322
|
+
obj = self.bindableObject(type)
|
323
|
+
if key.ord < Ncurses::KEY_MAX && !(obj.nil?)
|
324
|
+
if key.ord != 0
|
325
|
+
obj.binding_list[key.ord] = [function, data]
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def unbind(type, key)
|
331
|
+
obj = self.bindableObject(type)
|
332
|
+
unless obj.nil?
|
333
|
+
obj.binding_list.delete(key)
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def cleanBindings(type)
|
338
|
+
obj = self.bindableObject(type)
|
339
|
+
if !(obj.nil?) && !(obj.binding_list.nil?)
|
340
|
+
obj.binding_list.clear
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# This checks to see if the binding for the key exists:
|
345
|
+
# If it does then it runs the command and returns its value, normally true
|
346
|
+
# If it doesn't it returns a false. This way we can 'overwrite' coded
|
347
|
+
# bindings.
|
348
|
+
def checkBind(type, key)
|
349
|
+
obj = self.bindableObject(type)
|
350
|
+
if !(obj.nil?) && obj.binding_list.include?(key)
|
351
|
+
function = obj.binding_list[key][0]
|
352
|
+
data = obj.binding_list[key][1]
|
353
|
+
|
354
|
+
if function == :getc
|
355
|
+
return data
|
356
|
+
else
|
357
|
+
return function.call(type, obj, data, key)
|
358
|
+
end
|
359
|
+
end
|
360
|
+
return false
|
361
|
+
end
|
362
|
+
|
363
|
+
# This checks to see if the binding for the key exists.
|
364
|
+
def isBind(type, key)
|
365
|
+
result = false
|
366
|
+
obj = self.bindableObject(type)
|
367
|
+
unless obj.nil?
|
368
|
+
result = obj.binding_list.include?(key)
|
369
|
+
end
|
370
|
+
|
371
|
+
return result
|
372
|
+
end
|
373
|
+
|
374
|
+
# This allows the user to use the cursor keys to adjust the
|
375
|
+
# postion of the widget.
|
376
|
+
def position(win)
|
377
|
+
parent = @screen.window
|
378
|
+
orig_x = win.getbegx
|
379
|
+
orig_y = win.getbegy
|
380
|
+
beg_x = parent.getbegx
|
381
|
+
beg_y = parent.getbegy
|
382
|
+
end_x = beg_x + @screen.window.getmaxx
|
383
|
+
end_y = beg_y + @screen.window.getmaxy
|
384
|
+
|
385
|
+
# Let them move the widget around until they hit return.
|
386
|
+
while !([CDK::KEY_RETURN, Ncurses::KEY_ENTER].include?(
|
387
|
+
key = self.getch([])))
|
388
|
+
case key
|
389
|
+
when Ncurses::KEY_UP, '8'.ord
|
390
|
+
if win.getbegy > beg_y
|
391
|
+
self.move(0, -1, true, true)
|
392
|
+
else
|
393
|
+
CDK.Beep
|
394
|
+
end
|
395
|
+
when Ncurses::KEY_DOWN, '2'.ord
|
396
|
+
if (win.getbegy + win.getmaxy) < end_y
|
397
|
+
self.move(0, 1, true, true)
|
398
|
+
else
|
399
|
+
CDK.Beep
|
400
|
+
end
|
401
|
+
when Ncurses::KEY_LEFT, '4'.ord
|
402
|
+
if win.getbegx > beg_x
|
403
|
+
self.move(-1, 0, true, true)
|
404
|
+
else
|
405
|
+
CDK.Beep
|
406
|
+
end
|
407
|
+
when Ncurses::KEY_RIGHT, '6'.ord
|
408
|
+
if (win.getbegx + win.getmaxx) < end_x
|
409
|
+
self.move(1, 0, true, true)
|
410
|
+
else
|
411
|
+
CDK.Beep
|
412
|
+
end
|
413
|
+
when '7'.ord
|
414
|
+
if win.getbegy > beg_y && win.getbegx > beg_x
|
415
|
+
self.move(-1, -1, true, true)
|
416
|
+
else
|
417
|
+
CDK.Beep
|
418
|
+
end
|
419
|
+
when '9'.ord
|
420
|
+
if (win.getbegx + win.getmaxx) < end_x && win.getbegy > beg_y
|
421
|
+
self.move(1, -1, true, true)
|
422
|
+
else
|
423
|
+
CDK.Beep
|
424
|
+
end
|
425
|
+
when '1'.ord
|
426
|
+
if win.getbegx > beg_x && (win.getbegy + win.getmaxy) < end_y
|
427
|
+
self.move(-1, 1, true, true)
|
428
|
+
else
|
429
|
+
CDK.Beep
|
430
|
+
end
|
431
|
+
when '3'.ord
|
432
|
+
if (win.getbegx + win.getmaxx) < end_x &&
|
433
|
+
(win.getbegy + win.getmaxy) < end_y
|
434
|
+
self.move(1, 1, true, true)
|
435
|
+
else
|
436
|
+
CDK.Beep
|
437
|
+
end
|
438
|
+
when '5'.ord
|
439
|
+
self.move(CDK::CENTER, CDK::CENTER, false, true)
|
440
|
+
when 't'.ord
|
441
|
+
self.move(win.getbegx, CDK::TOP, false, true)
|
442
|
+
when 'b'.ord
|
443
|
+
self.move(win.getbegx, CDK::BOTTOM, false, true)
|
444
|
+
when 'l'.ord
|
445
|
+
self.move(CDK::LEFT, win.getbegy, false, true)
|
446
|
+
when 'r'.ord
|
447
|
+
self.move(CDK::RIGHT, win.getbegy, false, true)
|
448
|
+
when 'c'.ord
|
449
|
+
self.move(CDK::CENTER, win.getbegy, false, true)
|
450
|
+
when 'C'.ord
|
451
|
+
self.move(win.getbegx, CDK::CENTER, false, true)
|
452
|
+
when CDK::REFRESH
|
453
|
+
@screen.erase
|
454
|
+
@screen.refresh
|
455
|
+
when CDK::KEY_ESC
|
456
|
+
self.move(orig_x, orig_y, false, true)
|
457
|
+
else
|
458
|
+
CDK.Beep
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|