| # 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(): |
| vt = vt100win.VT100win() |
| # |
| host = 'biefstuk.cwi.nl' |
| tn = telnetlib.Telnet(host, 0) |
| # |
| try: |
| vt.send(tn.read_until('login: ', 10)) |
| tn.write('cwilib\r') |
| # |
| vt.send(tn.read_until('Hit <RETURN> to continue...', 10)) |
| tn.write('\r') |
| # |
| 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: |
| try: |
| data = tn.read_very_eager() |
| except EOFError: |
| 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 |
| else: |
| print '*** VT100 event:', type, detail |
| else: |
| print '*** Alien event:', type, window, detail |
| continue |
| rfd, wfd, xfd = select.select([tn, stdwin], [], []) |
| |
| |
| # Subroutine to define our screen recognition patterns |
| |
| def define_screens(vt): |
| 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'), |
| }) |
| |
| |
| # Class to implement our user interface. |
| |
| class UserInterface: |
| |
| 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) |
| |
| def __del__(self): |
| self.close() |
| |
| def close(self): |
| for form in self.forms: |
| form.close() |
| |
| def dispatch(self, type, window, detail): |
| for form in self.forms: |
| if window == form.window: |
| form.dispatch(type, detail) |
| |
| |
| def define_query_fields(f): |
| 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) |
| |
| |
| class QueryForm(Form): |
| |
| def __init__(self): |
| Form.__init__(self, 'Query form -- CWI Library') |
| |
| def dispatch(self, type, detail): |
| if type == WE_COMMAND and detail == WC_RETURN: |
| print '*** SUBMIT ***' |
| else: |
| Form.dispatch(self, type, detail) |
| |
| |
| class ListForm(Form): |
| |
| def __init__(self): |
| Form.__init__(self, 'Short list -- CWI Library') |
| |
| |
| class RecordForm(Form): |
| |
| def __init__(self): |
| Form.__init__(self, 'Record detail -- CWI Library') |
| |
| |
| main() |