| 
									
										
										
										
											1993-10-28 09:53:13 +00: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 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 	# | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  | 	vt.send(tn.read_until('Hit <RETURN> to continue...', 10)) | 
					
						
							|  |  |  | 	tn.write('\r') | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 	# | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 	try: | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  | 	    data = tn.read_very_eager() | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 	except EOFError: | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  | 		    print '*** VT100 event:', type, detail | 
					
						
							|  |  |  | 	    else: | 
					
						
							|  |  |  | 		print '*** Alien event:', type, window, detail | 
					
						
							|  |  |  | 	    continue | 
					
						
							|  |  |  | 	rfd, wfd, xfd = select.select([tn, stdwin], [], []) | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Subroutine to define our screen recognition patterns | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def define_screens(vt): | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Class to implement our user interface. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UserInterface: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def __del__(self): | 
					
						
							|  |  |  | 	self.close() | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def close(self): | 
					
						
							|  |  |  | 	for form in self.forms: | 
					
						
							|  |  |  | 	    form.close() | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def dispatch(self, type, window, detail): | 
					
						
							|  |  |  | 	for form in self.forms: | 
					
						
							|  |  |  | 	    if window == form.window: | 
					
						
							|  |  |  | 		form.dispatch(type, detail) | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def define_query_fields(f): | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QueryForm(Form): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  | 	Form.__init__(self, 'Query form -- CWI Library') | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00: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 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ListForm(Form): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  | 	Form.__init__(self, 'Short list -- CWI Library') | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RecordForm(Form): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-11-01 14:50:59 +00:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  | 	Form.__init__(self, 'Record detail -- CWI Library') | 
					
						
							| 
									
										
										
										
											1993-10-28 09:53:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | main() |