| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define(function(require){ var module = {} | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | console.log('>>> client') | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | doc = require('lib/keyboard').doc | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | data = require('data') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | // attr can be:
 | 
					
						
							|  |  |  | // 	"name"		- attribute name
 | 
					
						
							|  |  |  | // 	"name, name, ..."
 | 
					
						
							|  |  |  | // 				- string containign coma separated attribute names
 | 
					
						
							|  |  |  | // 	list 		- list of attribute names
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | // XXX add a callback here...
 | 
					
						
							| 
									
										
										
										
											2014-08-29 19:19:21 +04:00
										 |  |  | function proxy(attr, name){ | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 	// we can proxy multiple attrs...
 | 
					
						
							|  |  |  | 	attr = typeof(attr) == typeof('str')  | 
					
						
							|  |  |  | 		? attr.split(',').map(function(e){ return e.trim() }) | 
					
						
							|  |  |  | 		: attr | 
					
						
							| 
									
										
										
										
											2014-08-29 19:19:21 +04:00
										 |  |  | 	return function(){ | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 		var that = this | 
					
						
							|  |  |  | 		var args = arguments | 
					
						
							|  |  |  | 		attr.forEach(function(a){ | 
					
						
							|  |  |  | 			a = that[a] | 
					
						
							|  |  |  | 			a[name].apply(a, args) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2014-08-29 19:19:21 +04:00
										 |  |  | 		return this | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | function proxyMethods(obj, map){ | 
					
						
							|  |  |  | 	var txt = '' | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 	map = map == null ? obj : map | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for(var attr in map){ | 
					
						
							|  |  |  | 		var methods = map[attr] | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 		methods = typeof(methods) == typeof('str') ? {attr: methods} : methods | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 		for(var name in methods){ | 
					
						
							|  |  |  | 			var txt = methods[name] | 
					
						
							|  |  |  | 			if(txt == null){ | 
					
						
							|  |  |  | 				obj[name] = proxy(attr, name) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				obj[name] = doc(txt, proxy(attr, name)) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-29 19:19:21 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | // This will:
 | 
					
						
							|  |  |  | // 	- provide an abstraction layer to data (proxy)
 | 
					
						
							|  |  |  | // 	- provide API docs usable for doc generation...
 | 
					
						
							|  |  |  | // 	- provide callbacks (???)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | var ClientClassPrototype = { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ClientPrototype = { | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | 	// this expects the folowing attrs:
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// 	.data
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 	// direct proxy methods...
 | 
					
						
							|  |  |  | 	focusImage: 'Focus image', | 
					
						
							|  |  |  | 	focusRibbon: 'Focus ribbon', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	firstImage: 'Focus first image in current ribbon', | 
					
						
							|  |  |  | 	lastImage: 'Focus last image in current ribbon', | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 	// XXX client-specific API...
 | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | // XXX this is temporary...
 | 
					
						
							|  |  |  | // 		...this will messup actual methods...
 | 
					
						
							|  |  |  | proxyMethods(ClientPrototype) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX auto apply this...
 | 
					
						
							| 
									
										
										
										
											2014-09-04 17:31:05 +04:00
										 |  |  | function chainSelfAttrMethod(cls, attr, name, func){ | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 		return function(){ | 
					
						
							|  |  |  | 			// NOTE: this is super, python-style but without multiple 
 | 
					
						
							|  |  |  | 			// 		inheritance...
 | 
					
						
							|  |  |  | 			// 		...that last part makes this more of a code reuse 
 | 
					
						
							|  |  |  | 			// 		than a programming tool...
 | 
					
						
							| 
									
										
										
										
											2014-09-04 17:31:05 +04:00
										 |  |  | 			cls.__proto__[name].apply(this, arguments) | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 			// call the encapsulated method...
 | 
					
						
							| 
									
										
										
										
											2014-09-04 17:31:05 +04:00
										 |  |  | 			this[attr][name].apply(this[attr], arguments) | 
					
						
							|  |  |  | 			if(func != null){ | 
					
						
							|  |  |  | 				return func.apply(this, arguments) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | 			return this | 
					
						
							| 
									
										
										
										
											2014-10-04 03:29:23 +04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 17:31:05 +04:00
										 |  |  | function chainSelfAttrMethods(obj, map){ | 
					
						
							|  |  |  | 	for(var attr in map){ | 
					
						
							|  |  |  | 		var methods = map[attr] | 
					
						
							|  |  |  | 		for(var name in methods){ | 
					
						
							|  |  |  | 			obj[name] = doc(methods[name], chainSelfAttrMethod(obj, attr, name)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | var ViewerPrototype = { | 
					
						
							|  |  |  | 	// this expects the folowing attrs:
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// 	.ribbons
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-04 17:31:05 +04:00
										 |  |  | chainSelfAttrMethods(ViewerPrototype, { | 
					
						
							|  |  |  | 	ribbons: { | 
					
						
							|  |  |  | 		focusImage: 'Focus image',  | 
					
						
							|  |  |  | 		focusRibbon: 'Focus ribbon', | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | ViewerPrototype.__proto__ = ClientPrototype | 
					
						
							| 
									
										
										
										
											2014-09-02 02:55:03 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | var Client = | 
					
						
							|  |  |  | module.Client = Object.create(ClientPrototype) | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 06:45:04 +04:00
										 |  |  | var Viewer = | 
					
						
							|  |  |  | module.Viewer = Object.create(ViewerPrototype) | 
					
						
							| 
									
										
										
										
											2014-08-29 19:06:45 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                                                */ | 
					
						
							|  |  |  | return module }) |