~ubuntu-branches/ubuntu/hardy/gnue-common/hardy

« back to all changes in this revision

Viewing changes to src/cursing/sio.py

  • Committer: Bazaar Package Importer
  • Author(s): Andrew Mitchell
  • Date: 2005-03-09 11:06:31 UTC
  • Revision ID: james.westby@ubuntu.com-20050309110631-8gvvn39q7tjz1kj6
Tags: upstream-0.5.14
ImportĀ upstreamĀ versionĀ 0.5.14

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# This file is part of GNU Enterprise.
 
3
#
 
4
# GNU Enterprise is free software; you can redistribute it
 
5
# and/or modify it under the terms of the GNU General Public
 
6
# License as published by the Free Software Foundation; either
 
7
# version 2, or (at your option) any later version.
 
8
#
 
9
# GNU Enterprise is distributed in the hope that it will be
 
10
# useful, but WITHOUT ANY WARRANTY; without even the implied
 
11
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 
12
# PURPOSE. See the GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public
 
15
# License along with program; see the file COPYING. If not,
 
16
# write to the Free Software Foundation, Inc., 59 Temple Place
 
17
# - Suite 330, Boston, MA 02111-1307, USA.
 
18
#
 
19
# Copyright 2002-2005 Free Software Foundation
 
20
#
 
21
# FILE:
 
22
# sio.py
 
23
#
 
24
# DESCRIPTION:
 
25
#
 
26
# NOTES:
 
27
#
 
28
 
 
29
 
 
30
 
 
31
#
 
32
# sio.py
 
33
#
 
34
# An interface to curses
 
35
#
 
36
 
 
37
from constants import *
 
38
import curses
 
39
 
 
40
#C_SCREEN = 2
 
41
#C_TITLEBAR = 3
 
42
#C_MENUBAR = 4
 
43
#C_MENUBAR_FOCUS = 5
 
44
#C_LABEL = 6
 
45
#C_DIALOG = 7
 
46
#C_DIALOG_TITLE = 8
 
47
#C_TEXTBOX_FOCUS = 9
 
48
#C_TEXTBOX = 10
 
49
#C_BUTTON = 11
 
50
#C_BUTTON_FOCUS = 12
 
51
#C_SCROLL_BUTTON = 13
 
52
#C_SCROLL_BUTTON_FOCUS = 14
 
53
#C_SCROLL_BACKGROUND = 15
 
54
#C_SCROLL_SLIDER = 16
 
55
#C_SCROLL_SLIDER_FOCUS = 17
 
56
#C_STATUSBAR = 10
 
57
#C_STATUSBAR_FIELD = 10  # 7
 
58
 
 
59
 
 
60
def sio(*args, **parms):
 
61
  global _sio
 
62
  if not _sio:
 
63
    _sio = _Sio(*args, **parms)
 
64
  return _sio
 
65
 
 
66
_sio = None
 
67
 
 
68
class _Sio:
 
69
  """
 
70
  This class basically acts as an interface to curses.
 
71
 
 
72
  """
 
73
  def __init__(self):
 
74
 
 
75
    self.Started = 0
 
76
 
 
77
    self.MAXCOL = -1
 
78
    self.MAXROW = -1
 
79
 
 
80
    self.s = None     # s is a full screen curses window
 
81
    self.stdscr = None  # holds instance of full console screen
 
82
 
 
83
    self.TokNextField = 9
 
84
    self.TokActivate = 10
 
85
 
 
86
    # get curses keyevents into local tokens
 
87
    # TODO: what about ascii key maps?  ascii.BS?  Maybe should
 
88
    # modify these to handle tuples.
 
89
    self.TokBackspace = curses.KEY_BACKSPACE
 
90
    self.TokUpArrow = curses.KEY_UP
 
91
    self.TokDownArrow = curses.KEY_DOWN
 
92
    self.TokRightArrow = curses.KEY_RIGHT
 
93
    self.TokLeftArrow = curses.KEY_LEFT
 
94
    self.TokHomeKey = curses.KEY_HOME
 
95
    self.TokEndKey = curses.KEY_END
 
96
 
 
97
 
 
98
  def BeginScreenAccess(self):
 
99
    """Initialize the screen and setup for action."""
 
100
    gDebug(0,'initializing curses screen')
 
101
    #if self.s <> None:
 
102
    #  return
 
103
    gDebug(0,'initializing curses screen 1')
 
104
    self.stdscr = curses.initscr()
 
105
    self._NegotiateScreenSize()
 
106
    gDebug(0,'initializing curses screen 2')
 
107
    self.s = curses.newwin(self.MAXROW+1, self.MAXCOL+1, 0, 0)
 
108
    curses.noecho()
 
109
    gDebug(0,'initializing curses screen 3')
 
110
    #curses.nonl()  # disallows usage of <CR> as a selector.
 
111
    curses.cbreak()
 
112
    self.s.keypad(1)
 
113
    gDebug(0,'initializing curses screen 4')
 
114
    # make the cursor very visible
 
115
    #curses.curs_set(2) # throws an ERR, removing.
 
116
 
 
117
    global ti_chars
 
118
    ti_chars = {
 
119
      tiHLINE : curses.ACS_HLINE,
 
120
      tiVLINE : curses.ACS_VLINE,
 
121
      tiBOX : curses.ACS_BOARD,
 
122
      tiLLC : curses.ACS_LLCORNER,
 
123
      tiLRC : curses.ACS_LRCORNER,
 
124
      tiDAW : curses.ACS_DARROW,
 
125
      tiULC : curses.ACS_ULCORNER,
 
126
      tiURC : curses.ACS_URCORNER,
 
127
      tiUTEE : curses.ACS_TTEE,
 
128
      tiLTEE : curses.ACS_LTEE,
 
129
      tiRTEE : curses.ACS_RTEE,
 
130
      tiBULL : curses.ACS_PLUS}
 
131
    gDebug(0,'initializing curses screen 5')
 
132
 
 
133
    # TODO: should really only do this if configuration
 
134
    # TODO: says yes, or on some other test.
 
135
    curses.start_color()
 
136
 
 
137
    import ColorScheme
 
138
 
 
139
    if curses.has_colors():
 
140
      gDebug(1,"Initializing StandardWhiteOnBlue colors")
 
141
      self.colors = ColorScheme.StandardWhiteOnBlue()
 
142
 
 
143
#        curses.init_pair(C_SCREEN, curses.COLOR_WHITE,curses.COLOR_BLUE)
 
144
#        curses.init_pair(C_TITLEBAR, curses.COLOR_WHITE,curses.COLOR_BLUE)
 
145
#        curses.init_pair(C_MENUBAR, curses.COLOR_YELLOW,curses.COLOR_BLUE)
 
146
#        curses.init_pair(C_MENUBAR_FOCUS, curses.COLOR_BLUE,curses.COLOR_WHITE)
 
147
#        curses.init_pair(C_LABEL, curses.COLOR_BLACK,curses.COLOR_WHITE)
 
148
#        curses.init_pair(C_DIALOG, curses.COLOR_BLACK,curses.COLOR_WHITE)
 
149
#        curses.init_pair(C_DIALOG_TITLE, curses.COLOR_YELLOW,curses.COLOR_WHITE)
 
150
#        curses.init_pair(C_TEXTBOX_FOCUS, curses.COLOR_BLACK,curses.COLOR_CYAN)
 
151
##        curses.init_pair(C_TEXTBOX, curses.COLOR_WHITE,curses.COLOR_BLUE)
 
152
#        curses.init_pair(C_TEXTBOX, curses.COLOR_BLUE,curses.COLOR_WHITE)
 
153
#        curses.init_pair(C_BUTTON, curses.COLOR_BLUE,curses.COLOR_WHITE)
 
154
##        curses.init_pair(C_BUTTON_FOCUS, curses.COLOR_WHITE,curses.COLOR_CYAN)
 
155
#        curses.init_pair(C_SCROLL_BUTTON, curses.COLOR_BLACK,curses.COLOR_WHITE)
 
156
#        curses.init_pair(C_SCROLL_BUTTON_FOCUS, curses.COLOR_CYAN,curses.COLOR_WHITE)
 
157
#        curses.init_pair(C_SCROLL_BACKGROUND, curses.COLOR_BLUE,curses.COLOR_GRAY)
 
158
#        curses.init_pair(C_SCROLL_SLIDER, curses.COLOR_WHITE,curses.COLOR_BLUE)
 
159
#        curses.init_pair(C_SCROLL_SLIDER_FOCUS, 0, curses.COLOR_CYAN)
 
160
##        curses.init_pair(C_STATUSBAR, curses.COLOR_BLACK, curses.COLOR_WHITE)
 
161
##        curses.init_pair(C_STATUSBAR_FIELD, curses.COLOR_BLUE, curses.COLOR_WHITE)
 
162
    else:
 
163
      gDebug(1,"Initializing Monochrome colors")
 
164
      self.colors = ColorScheme.Monochrome()
 
165
 
 
166
 
 
167
 
 
168
    events = curses.mousemask(curses.BUTTON1_CLICKED)
 
169
 
 
170
#    if events == 0:
 
171
#      self.PrintAt(self.MAXROW, self.MAXCOL-8, 'no mouse.')
 
172
 
 
173
    self.AutoRefresh = 1
 
174
    self.Started = 1
 
175
    self.PrintMods = 0
 
176
 
 
177
    return(self.s)
 
178
 
 
179
 
 
180
  def EndScreenAccess(self):
 
181
    # S is nothing, no need to end curses stuff
 
182
    if self.s == None:
 
183
      return
 
184
    self.Cls()
 
185
    curses.nocbreak()
 
186
    self.s.keypad(0)
 
187
    curses.echo()
 
188
    curses.endwin()
 
189
 
 
190
 
 
191
  def CaptureScreen(self, r1, c1, r2, c2):
 
192
    """
 
193
    Return a rectangle within the screen specified from corner 1 at
 
194
    (r1,c1) to corner 2 at (r2,c2).
 
195
    """
 
196
 
 
197
    scrnbuff = {}
 
198
    for rows in range(r1, r2):
 
199
      for cols in range(c1, c2):
 
200
        scrnbuff[str(rows)+"X"+str(cols)]=self.GetCharAt(rows,cols)
 
201
    return scrnbuff
 
202
 
 
203
 
 
204
  def RestoreScreen(self, r1, c1, r2, c2, scrnbuff):
 
205
    """
 
206
    Redraw screen within any rectangle from buffer.  Does nothing if
 
207
    buffer passed is {}.
 
208
    """
 
209
    if scrnbuff == {}:
 
210
      return
 
211
 
 
212
    self.AutoRefresh = 0
 
213
    self.LoLight()
 
214
 
 
215
    for rows in range(r1, r2):
 
216
      for cols in range(c1, c2):
 
217
        self.PutAt(rows,cols, scrnbuff[str(rows)+"X"+str(cols)])
 
218
 
 
219
    self.AutoRefresh = 1
 
220
    self.Refresh()
 
221
 
 
222
 
 
223
  def _NegotiateScreenSize(self):
 
224
    """ Private:
 
225
    Set self.MAXROW and self.MAXCOL less one pixel from
 
226
    stdscr.getmaxyx() which returns tuple (y,x) of height and width of
 
227
    the window.  """
 
228
    (lmaxY, lmaxX) = self.stdscr.getmaxyx()
 
229
    self.MAXROW = lmaxY - 1
 
230
    self.MAXCOL = lmaxX - 1
 
231
 
 
232
 
 
233
 
 
234
#
 
235
# suggest depricate and remove this def.  Is it used for
 
236
# forms compatibility?
 
237
#
 
238
  def GetScreenInstance(self):
 
239
    """
 
240
    """
 
241
    return self.s
 
242
 
 
243
 
 
244
  def SetScreenInstance(self, s):
 
245
    """
 
246
    """
 
247
    self.s = s
 
248
 
 
249
 
 
250
  def GetCharAt(self, Row, Col):
 
251
    """
 
252
    """
 
253
    return self.s.inch(Row, Col)
 
254
 
 
255
 
 
256
  def GetChar(self):
 
257
    """
 
258
    """
 
259
    return self.s.getch()
 
260
 
 
261
 
 
262
  def GetStr(self,Y,X,N):
 
263
    """
 
264
    FIXME:
 
265
    Retrieve a string N long from (X,Y) traveling along
 
266
    """
 
267
    result = []
 
268
    for i in range(0,N):
 
269
      result.append(self.s.inch(Y+i,X))
 
270
    return result
 
271
 
 
272
 
 
273
  def GotoYX(self, Row, Col):
 
274
    self.s.move( Row, Col)
 
275
    if self.AutoRefresh :
 
276
      self.s.refresh()
 
277
 
 
278
  def GetYX(self):
 
279
    return self.s.getyx()
 
280
 
 
281
  def Print(self, String, Mods = 0):
 
282
#    PrevMod = self.PrintMods
 
283
#    if Mods != None:
 
284
#      PrevMod |= Mods
 
285
    PrevMod = Mods
 
286
 
 
287
    refreshState = self.AutoRefresh
 
288
    self.AutoRefresh = 0
 
289
 
 
290
    for i in range(0,len(String)):
 
291
      if ti_chars.has_key(ord(String[i])):
 
292
        actch = ti_chars[ord(String[i])]
 
293
        self.s.addch(actch, PrevMod)
 
294
      else:
 
295
        self.s.addstr(str(String[i]), PrevMod)
 
296
 
 
297
    self.AutoRefresh = refreshState
 
298
 
 
299
    if self.AutoRefresh :
 
300
      self.s.refresh()
 
301
 
 
302
 
 
303
  def PutAt(self,Y,X,Char, Mods = None):
 
304
    """
 
305
    """
 
306
    PrevMod = self.PrintMods
 
307
    if Mods != None:
 
308
      PrevMod |= Mods
 
309
    try:
 
310
      self.s.addch(Y,X,Char,PrevMod)
 
311
    except curses.error:
 
312
      pass
 
313
 
 
314
 
 
315
  def HiLight(self):
 
316
    """
 
317
    """
 
318
    return
 
319
 
 
320
 
 
321
    if curses.has_colors():
 
322
      # TODO: should this be curses.color_pair(colorHi)?
 
323
      #self.PrintMods = curses.color_pair(colorHi)
 
324
      self.PrintMods = curses.A_BOLD
 
325
    else:
 
326
      self.PrintMods = curses.A_NORMAL
 
327
 
 
328
 
 
329
  def LoLight(self):
 
330
    """
 
331
    """
 
332
    return
 
333
 
 
334
 
 
335
    if curses.has_colors():
 
336
      self.PrintMods = curses.color_pair(colorLow)
 
337
    else:
 
338
      self.PrintMods = curses.A_DIM
 
339
 
 
340
 
 
341
  def SetColor(self, ll, hl=None):
 
342
    """
 
343
    """
 
344
    return
 
345
 
 
346
 
 
347
##    if type(ll) == type( (0,) ):
 
348
##      ll, hl = ll
 
349
 
 
350
##    self.COLOR = (ll,hl)
 
351
    self.COLOR = ll
 
352
    try:
 
353
      if curses.has_colors():
 
354
        self.PrintMods = curses.color_pair(ll)
 
355
    except AttributeError:
 
356
      pass
 
357
 
 
358
  def GetColor(self):
 
359
    return 0
 
360
    #return self.COLOR
 
361
 
 
362
 
 
363
  def PrintAt(self, Row, Col, String, Mods = 0):
 
364
    """
 
365
    """
 
366
    self.GotoYX(Row, Col)
 
367
    self.Print(String,Mods)
 
368
 
 
369
 
 
370
  def Cls(self):
 
371
    """
 
372
    """
 
373
    self.AutoRefresh = 0
 
374
    for row in range(0, self.MAXROW+1):
 
375
      self.PrintAt(row, 0, " " * self.MAXCOL, self.colors.C_BACKGROUND)
 
376
    self.AutoRefresh = 1
 
377
 
 
378
 
 
379
  def Refresh(self):
 
380
    """
 
381
    """
 
382
    self.s.refresh()