Module: CDK::Traverse

Defined in:
lib/cdk/traverse.rb

Class Method Summary collapse

Class Method Details

.exitCancelCDKScreen(screen) ⇒ Object



11
12
13
# File 'lib/cdk/traverse.rb', line 11

def Traverse.exitCancelCDKScreen(screen)
  screen.exit_status = CDK::SCREEN::EXITCANCEL
end

.exitCancelCDKScreenOf(obj) ⇒ Object



19
20
21
# File 'lib/cdk/traverse.rb', line 19

def Traverse.exitCancelCDKScreenOf(obj)
  exitCancelCDKScreen(obj.screen)
end

.exitOKCDKScreen(screen) ⇒ Object



7
8
9
# File 'lib/cdk/traverse.rb', line 7

def Traverse.exitOKCDKScreen(screen)
  screen.exit_status = CDK::SCREEN::EXITOK
end

.exitOKCDKScreenOf(obj) ⇒ Object



15
16
17
# File 'lib/cdk/traverse.rb', line 15

def Traverse.exitOKCDKScreenOf(obj)
  exitOKCDKScreen(obj.screen)
end

.getCDKFocusCurrent(screen) ⇒ Object

Returns the object on which the focus lies.



28
29
30
31
32
33
34
35
36
37
# File 'lib/cdk/traverse.rb', line 28

def Traverse.getCDKFocusCurrent(screen)
  result = nil
  n = screen.object_focus

  if n >= 0 && n < screen.object_count
    result = screen.object[n]
  end

  return result
end

.resetCDKScreen(screen) ⇒ Object



3
4
5
# File 'lib/cdk/traverse.rb', line 3

def Traverse.resetCDKScreen(screen)
  refreshDataCDKScreen(screen)
end

.resetCDKScreenOf(obj) ⇒ Object



23
24
25
# File 'lib/cdk/traverse.rb', line 23

def Traverse.resetCDKScreenOf(obj)
  resetCDKScreen(obj.screen)
end

.setCDKFocusCurrent(screen, newobj) ⇒ Object

Set focus to a specific object, returning it. If the object cannot be found, return nil.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/cdk/traverse.rb', line 93

def Traverse.setCDKFocusCurrent(screen, newobj)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n

  while true
    n += 1
    if n >= screen.object_count
      n = 0
    end

    curobj = screen.object[n]
    if curobj == newobj
      result = curobj
      break
    elsif n == first
      break
    end
  end

  setFocusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end

.setCDKFocusFirst(screen) ⇒ Object

Set focus to the first object in the screen.



119
120
121
122
# File 'lib/cdk/traverse.rb', line 119

def Traverse.setCDKFocusFirst(screen)
  setFocusIndex(screen, screen.object_count - 1)
  return switchFocus(setCDKFocusNext(screen), nil)
end

.setCDKFocusLast(screen) ⇒ Object

Set focus to the last object in the screen.



125
126
127
128
# File 'lib/cdk/traverse.rb', line 125

def Traverse.setCDKFocusLast(screen)
  setFocusIndex(screen, 0)
  return switchFocus(setCDKFocusPrevious(screen), nil)
end

.setCDKFocusNext(screen) ⇒ Object

Set focus to the next object, returning it.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/cdk/traverse.rb', line 40

def Traverse.setCDKFocusNext(screen)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n
  
  while true
    n+= 1
    if n >= screen.object_count
      n = 0
    end
    curobj = screen.object[n]
    if !(curobj.nil?) && curobj.accepts_focus
      result = curobj
      break
    else
      if n == first
        break
      end
    end
  end

  setFocusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end

.setCDKFocusPrevious(screen) ⇒ Object

Set focus to the previous object, returning it.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/cdk/traverse.rb', line 67

def Traverse.setCDKFocusPrevious(screen)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n

  while true
    n -= 1
    if n < 0
      n = screen.object_count - 1
    end
    curobj = screen.object[n]
    if !(curobj.nil?) && curobj.accepts_focus
      result = curobj
      break
    elsif n == first
      break
    end
  end

  setFocusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end

.traverseCDKOnce(screen, curobj, key_code, function_key, func_menu_key) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/cdk/traverse.rb', line 130

def Traverse.traverseCDKOnce(screen, curobj, key_code,
    function_key, func_menu_key)
  case key_code
  when Ncurses::KEY_BTAB
    switchFocus(setCDKFocusPrevious(screen), curobj)
  when CDK::KEY_TAB
    switchFocus(setCDKFocusNext(screen), curobj)
  when CDK.KEY_F(10)
    # save data and exit
    exitOKCDKScreen(screen)
  when CDK.CTRL('X')
    exitCancelCDKScreen(screen)
  when CDK.CTRL('R')
    # reset data to defaults
    resetCDKScreen(screen)
    setFocus(curobj)
  when CDK::REFRESH
    # redraw screen
    screen.refresh
    setFocus(curobj)
  else
    # not everyone wants menus, so we make them optional here
    if !(func_menu_key.nil?) &&
        (func_menu_key.call(key_code, function_key))
      # find and enable drop down menu
      screen.object.each do |object|
        if !(object.nil?) && object.object_type == :MENU
          Traverse.handleMenu(screen, object, curobj)
        end
      end
    else
      curobj.inject(key_code)
    end
  end
end

.traverseCDKScreen(screen) ⇒ Object

Traverse the widgets on a screen.



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/cdk/traverse.rb', line 167

def Traverse.traverseCDKScreen(screen)
  result = 0
  curobj = setCDKFocusFirst(screen)

  unless curobj.nil?
    refreshDataCDKScreen(screen)

    screen.exit_status = CDK::SCREEN::NOEXIT

    while !((curobj = getCDKFocusCurrent(screen)).nil?) &&
        screen.exit_status == CDK::SCREEN::NOEXIT
      function = []
      key = curobj.getch(function)

      # TODO look at more direct way to do this
      check_menu_key = lambda do |key_code, function_key|
        Traverse.checkMenuKey(key_code, function_key)
      end


      Traverse.traverseCDKOnce(screen, curobj, key,
          function[0], check_menu_key)
    end

    if screen.exit_status == CDK::SCREEN::EXITOK
      saveDataCDKScreen(screen)
      result = 1
    end
  end
  return result
end