1993-10-28 10:53:13 +01:00
|
|
|
# Interface to the interactive CWI library catalog.
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import stdwin
|
|
|
|
from stdwinevents import *
|
|
|
|
import select
|
|
|
|
import telnetlib
|
|
|
|
import vt100win
|
|
|
|
from form import Form
|
|
|
|
|
|
|
|
|
|
|
|
# Main program
|
|
|
|
|
|
|
|
def main():
|
1993-11-01 15:50:59 +01:00
|
|
|
vt = vt100win.VT100win()
|
|
|
|
#
|
|
|
|
host = 'biefstuk.cwi.nl'
|
|
|
|
tn = telnetlib.Telnet(host, 0)
|
|
|
|
#
|
|
|
|
try:
|
|
|
|
vt.send(tn.read_until('login: ', 10))
|
|
|
|
tn.write('cwilib\r')
|
1993-10-28 10:53:13 +01:00
|
|
|
#
|
1993-11-01 15:50:59 +01:00
|
|
|
vt.send(tn.read_until('Hit <RETURN> to continue...', 10))
|
|
|
|
tn.write('\r')
|
1993-10-28 10:53:13 +01:00
|
|
|
#
|
1993-11-01 15:50:59 +01:00
|
|
|
vt.send(tn.read_until('QUIT', 20))
|
|
|
|
except EOFError:
|
|
|
|
sys.stderr.write('Connection closed prematurely\n')
|
|
|
|
sys.exit(1)
|
|
|
|
#
|
|
|
|
define_screens(vt)
|
|
|
|
matches = vt.which_screens()
|
|
|
|
if 'menu' not in matches:
|
|
|
|
sys.stderr.write('Main menu does not appear\n')
|
|
|
|
sys.exit(1)
|
|
|
|
#
|
|
|
|
tn.write('\r\r')
|
|
|
|
vt.open('Progress -- CWI Library')
|
|
|
|
vt.set_debuglevel(0)
|
|
|
|
ui = UserInterface()
|
|
|
|
#
|
|
|
|
while 1:
|
1993-10-28 10:53:13 +01:00
|
|
|
try:
|
1993-11-01 15:50:59 +01:00
|
|
|
data = tn.read_very_eager()
|
1993-10-28 10:53:13 +01:00
|
|
|
except EOFError:
|
1993-11-01 15:50:59 +01:00
|
|
|
stdwin.message('Connection closed--goodbye')
|
|
|
|
break
|
|
|
|
if data:
|
|
|
|
print 'send...'
|
|
|
|
vt.send(data)
|
|
|
|
print 'send...done'
|
|
|
|
continue
|
|
|
|
event = stdwin.pollevent()
|
|
|
|
if event:
|
|
|
|
type, window, detail = event
|
|
|
|
if window == None and type == WE_LOST_SEL:
|
|
|
|
window = ui.queryform.window
|
|
|
|
event = type, window, detail
|
|
|
|
if type == WE_CLOSE:
|
|
|
|
break
|
|
|
|
if window in ui.windows:
|
|
|
|
ui.dispatch(type, window, detail)
|
|
|
|
elif window == vt.window:
|
|
|
|
if type == WE_NULL:
|
|
|
|
pass
|
|
|
|
elif type == WE_COMMAND:
|
|
|
|
if detail == WC_RETURN:
|
|
|
|
tn.write('\r')
|
|
|
|
elif detail == WC_BACKSPACE:
|
|
|
|
tn.write('\b')
|
|
|
|
elif detail == WC_TAB:
|
|
|
|
tn.write('\t')
|
|
|
|
elif detail == WC_UP:
|
|
|
|
tn.write('\033[A')
|
|
|
|
elif detail == WC_DOWN:
|
|
|
|
tn.write('\033[B')
|
|
|
|
elif detail == WC_RIGHT:
|
|
|
|
tn.write('\033[C')
|
|
|
|
elif detail == WC_LEFT:
|
|
|
|
tn.write('\033[D')
|
|
|
|
else:
|
|
|
|
print '*** Command:', detail
|
|
|
|
elif type == WE_CHAR:
|
|
|
|
tn.write(detail)
|
|
|
|
elif type == WE_DRAW:
|
|
|
|
vt.draw(detail)
|
|
|
|
elif type in (WE_ACTIVATE, WE_DEACTIVATE):
|
|
|
|
pass
|
1993-10-28 10:53:13 +01:00
|
|
|
else:
|
1993-11-01 15:50:59 +01:00
|
|
|
print '*** VT100 event:', type, detail
|
|
|
|
else:
|
|
|
|
print '*** Alien event:', type, window, detail
|
|
|
|
continue
|
|
|
|
rfd, wfd, xfd = select.select([tn, stdwin], [], [])
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
# Subroutine to define our screen recognition patterns
|
|
|
|
|
|
|
|
def define_screens(vt):
|
1993-11-01 15:50:59 +01:00
|
|
|
vt.define_screen('menu', {
|
|
|
|
'title': ('search', 0, 0, 80,
|
|
|
|
' SEARCH FUNCTIONS +OTHER FUNCTIONS '),
|
|
|
|
})
|
|
|
|
vt.define_screen('search', {
|
|
|
|
'title': ('search', 0, 0, 80, ' Search '),
|
|
|
|
})
|
|
|
|
vt.define_screen('shortlist', {'title': ('search', 0, 0, 80,
|
|
|
|
' Short-list')})
|
|
|
|
vt.define_screen('showrecord', {
|
|
|
|
'title': ('search', 0, 0, 80, ' Show record '),
|
|
|
|
})
|
|
|
|
vt.define_screen('timelimit', {
|
|
|
|
'limit': ('search', 12, 0, 80, ' TIME LIMIT '),
|
|
|
|
})
|
|
|
|
vt.define_screen('attention', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'search'),
|
|
|
|
'title': ('search', 10, 0, 80, ' ATTENTION ')})
|
|
|
|
vt.define_screen('syntaxerror', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'attention'),
|
|
|
|
'message': ('search', 12, 0, 80, ' Syntax error'),
|
|
|
|
})
|
|
|
|
vt.define_screen('emptyerror', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'attention'),
|
|
|
|
'message': ('search', 12, 0, 80,
|
|
|
|
' Check your input. Search at least one term'),
|
|
|
|
})
|
|
|
|
vt.define_screen('unsortedwarning', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'attention'),
|
|
|
|
'message': ('search', 12, 0, 80,
|
|
|
|
' Number of records exceeds sort limit'),
|
|
|
|
})
|
|
|
|
vt.define_screen('thereismore', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'showrecord'),
|
|
|
|
'message': ('search', 15, 0, 80,
|
|
|
|
'There is more within this record. Use the arrow keys'),
|
|
|
|
})
|
|
|
|
vt.define_screen('nofurther', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'showrecord'),
|
|
|
|
'message': ('search', 17, 0, 80, 'You cannot go further\.'),
|
|
|
|
})
|
|
|
|
vt.define_screen('nofurtherback', {
|
|
|
|
'BASE': ('copy', 0, 0, 0, 'showrecord'),
|
|
|
|
'message': ('search', 17, 0, 80,
|
|
|
|
'You cannot go further back'),
|
|
|
|
})
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
# Class to implement our user interface.
|
|
|
|
|
|
|
|
class UserInterface:
|
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def __init__(self):
|
|
|
|
stdwin.setfont('7x14')
|
|
|
|
self.queryform = QueryForm()
|
|
|
|
self.listform = ListForm()
|
|
|
|
self.recordform = RecordForm()
|
|
|
|
self.forms = [self.queryform, self.listform, self.recordform]
|
|
|
|
define_query_fields(self.queryform)
|
|
|
|
self.windows = []
|
|
|
|
for form in self.forms:
|
|
|
|
if form.formheight > 0:
|
|
|
|
form.open()
|
|
|
|
self.windows.append(form.window)
|
1993-10-28 10:53:13 +01:00
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def __del__(self):
|
|
|
|
self.close()
|
1993-10-28 10:53:13 +01:00
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def close(self):
|
|
|
|
for form in self.forms:
|
|
|
|
form.close()
|
1993-10-28 10:53:13 +01:00
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def dispatch(self, type, window, detail):
|
|
|
|
for form in self.forms:
|
|
|
|
if window == form.window:
|
|
|
|
form.dispatch(type, detail)
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
def define_query_fields(f):
|
1993-11-01 15:50:59 +01:00
|
|
|
f.define_field('name', 'Name auth./ed.', 1, 60)
|
|
|
|
f.define_field('title', 'Title', 4, 60)
|
|
|
|
f.define_field('shelfmark', 'Shelf mark', 1, 60)
|
|
|
|
f.define_field('class', 'Prim. classif.', 1, 60)
|
|
|
|
f.define_field('series', 'Series', 1, 60)
|
|
|
|
f.define_field('congress', 'Congr. pl./year', 1, 60)
|
|
|
|
f.define_field('type', 'Type', 1, 60)
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
class QueryForm(Form):
|
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def __init__(self):
|
|
|
|
Form.__init__(self, 'Query form -- CWI Library')
|
1993-10-28 10:53:13 +01:00
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def dispatch(self, type, detail):
|
|
|
|
if type == WE_COMMAND and detail == WC_RETURN:
|
|
|
|
print '*** SUBMIT ***'
|
|
|
|
else:
|
|
|
|
Form.dispatch(self, type, detail)
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
class ListForm(Form):
|
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def __init__(self):
|
|
|
|
Form.__init__(self, 'Short list -- CWI Library')
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
class RecordForm(Form):
|
|
|
|
|
1993-11-01 15:50:59 +01:00
|
|
|
def __init__(self):
|
|
|
|
Form.__init__(self, 'Record detail -- CWI Library')
|
1993-10-28 10:53:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
main()
|