Files correlati : Ricompilazione Demo : [ ] Commento : Sistemate le definizioni di XI_R4 git-svn-id: svn://10.65.10.50/trunk@16429 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			313 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <controls.h>
 | ||
| #include <image.h>
 | ||
| #include <virtkeyb.h>
 | ||
| #include <utility.h>
 | ||
| 
 | ||
| #define DLG_BACKSPACE	400
 | ||
| #define DLG_CAPS	    401
 | ||
| #define DLG_LSHIFT	  402
 | ||
| #define DLG_RSHIFT	  403
 | ||
| #define DLG_LARR  	  404
 | ||
| #define DLG_RARR  	  405
 | ||
| #define DLG_F2				406
 | ||
| #define DLG_BASE  	  500
 | ||
| 
 | ||
| bool TVirtual_keyboard::handler(TMask_field& f, KEY key)
 | ||
| {
 | ||
| 	if (key == K_SPACE)
 | ||
| 	{
 | ||
| 		const short id = f.dlg();
 | ||
| 		TVirtual_keyboard & m = (TVirtual_keyboard &) f.mask();
 | ||
| 		static  bool vk_shift = false;
 | ||
| 		static  bool vk_caps = false;
 | ||
| 		int & pos = m.pos();
 | ||
| 		TMask_field & target = m.field(101);
 | ||
| 
 | ||
| 		target.set_focus();
 | ||
| 
 | ||
| 		switch (id)
 | ||
| 		{
 | ||
| 		case DLG_BACKSPACE :
 | ||
| 			if (pos > 0)
 | ||
| 			{
 | ||
| 				TString val(m.get(101));
 | ||
| 
 | ||
| 			  if (pos == val.len())
 | ||
| 					val.rtrim(1);
 | ||
| 				else
 | ||
| 				{
 | ||
| 					const TString v = val.mid(pos);
 | ||
| 
 | ||
| 					val.cut(pos - 1);
 | ||
| 					val << v;
 | ||
| 				}
 | ||
| 				pos--;
 | ||
| 				target.set(val);
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		case DLG_F2 :
 | ||
| 				pos = 0;
 | ||
| 				target.reset();
 | ||
| 			break;
 | ||
| 		case DLG_CAPS :
 | ||
| 				vk_caps = !vk_caps;
 | ||
| 			break;
 | ||
| 		case DLG_RSHIFT :
 | ||
| 		case DLG_LSHIFT :
 | ||
| 				vk_shift = true;
 | ||
| 			break;
 | ||
| 		case DLG_LARR :
 | ||
| 			if (pos > 0)
 | ||
| 				pos--;
 | ||
| 			break;
 | ||
| 		case DLG_RARR:
 | ||
| 			if (pos < target.get().len())
 | ||
| 				pos++;
 | ||
| 			break;
 | ||
| 		default :
 | ||
| 			if (id >= DLG_BASE + ' ' && pos < target.size())
 | ||
| 			{
 | ||
| 				char k = id - DLG_BASE;
 | ||
| 
 | ||
| 				if (vk_caps || vk_shift)
 | ||
| 					  k = toupper(k);
 | ||
| 				vk_shift = false;
 | ||
| 
 | ||
| 				TString val(target.get());
 | ||
| 
 | ||
| 				val.insert(format("%c", k), pos++);
 | ||
| 				target.set(val);
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		target.set_caret_pos(pos);
 | ||
| 	}
 | ||
| 	return true;
 | ||
| }
 | ||
| 
 | ||
| void TVirtual_keyboard::create_keyboard_row(int y, const char * keyboard_row)
 | ||
| {
 | ||
| 	const TString80 row(keyboard_row);
 | ||
| 	const int len = row.len();
 | ||
| 	RCT rw;
 | ||
| 	short id;
 | ||
| 	int x;
 | ||
| 	TString16 prompt;
 | ||
| 
 | ||
| 	xvt_vobj_get_client_rect(win(), &rw);
 | ||
|   const int width = xvt_rect_get_width(&rw);
 | ||
| 
 | ||
| 	x = 0;
 | ||
| 	for (int i = 0; i < len; i++)
 | ||
| 	{
 | ||
| 		unsigned char k = row[i];
 | ||
| 		
 | ||
| 		switch (k)
 | ||
| 		{
 | ||
| 		case '\b' :
 | ||
| 			id = DLG_BACKSPACE;
 | ||
| 			prompt = "<<";
 | ||
| 			break;
 | ||
| 		case '\n' :
 | ||
| 			id = DLG_OK;
 | ||
| 			prompt = "Invio";
 | ||
| 			break;
 | ||
| 		case '\01' :
 | ||
| 			id = DLG_CAPS;
 | ||
| 			prompt = "Mai";
 | ||
| 			break;
 | ||
| 		case '\02' :
 | ||
| 			id = DLG_RSHIFT;
 | ||
| 			prompt = "Shift";
 | ||
| 			break;
 | ||
| 		case '\03' :
 | ||
| 			id = DLG_LSHIFT;
 | ||
| 			prompt = "Shift";
 | ||
| 			break;
 | ||
| 		case '\04' :
 | ||
| 			id = DLG_LARR;
 | ||
| 			prompt = "<-";
 | ||
| 			break;
 | ||
| 		case '\05' :
 | ||
| 			id = DLG_RARR;
 | ||
| 			prompt = "->";
 | ||
| 			break;
 | ||
| 		case '\06' :
 | ||
| 			id = DLG_F2;
 | ||
| 			prompt = "Azzera";
 | ||
| 			break;
 | ||
| 		case '\27' :
 | ||
| 			id = DLG_CANCEL;
 | ||
| 			prompt = "Esc";
 | ||
| 			break;
 | ||
| 		default :
 | ||
| 			if (k >= ' ')
 | ||
| 			{
 | ||
| 				id = DLG_BASE + k;
 | ||
| 				prompt = " "; prompt[0] = k;
 | ||
| 			}
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		
 | ||
| 		const int w = prompt.len() > 2 ? 2 : 1;
 | ||
| 		prompt.insert("@g");
 | ||
| 		TButton_field & b = add_button(id, 0, "", x, y, w, 2, "");
 | ||
| 		TFilename bmp(prompt);
 | ||
| 
 | ||
| 		if (TImage::build_filename(bmp))
 | ||
| 			b.set_bmp(bmp);
 | ||
| 		else
 | ||
| 			b.set_prompt(prompt);
 | ||
| 
 | ||
| 		set_handler(id, handler);
 | ||
| 		
 | ||
| 		RCT r;
 | ||
| 
 | ||
| 		r.left = x * (width / buttons_per_row() -  4);
 | ||
| 		r.right = r.left + w * width / buttons_per_row() ;
 | ||
| 		r.top = (ROWY - 2) * y;
 | ||
| 		r.bottom = r.top + ROWY * 2;
 | ||
| 		b.set_rect(r);
 | ||
| 		x += w;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| KEY TVirtual_keyboard::run()
 | ||
| {
 | ||
| 	if (id2pos(500 + '0') < 0)
 | ||
| 		init();
 | ||
| 	set(101, fld().get());
 | ||
| 	_pos = fld().get().len();
 | ||
| 	field(101).set_caret_pos(_pos);
 | ||
| 
 | ||
| 	KEY k = TMask::run();
 | ||
| 
 | ||
| 	if (k == K_ENTER)
 | ||
| 	{
 | ||
| 		TMask & mask = fld().mask();
 | ||
| 
 | ||
| 		fld().set(get(101));
 | ||
| 		fld().set_focus();
 | ||
| 		mask.send_key(K_TAB, 0);
 | ||
| 		mask.send_key(K_F12, 0);
 | ||
| 	}
 | ||
| 	else
 | ||
| 		_fld.set_focus();
 | ||
| 	return k;
 | ||
| }
 | ||
| 
 | ||
| void TVirtual_keyboard::init()
 | ||
| {
 | ||
| 	TString flags;
 | ||
| 
 | ||
| 	if (fld().password())
 | ||
| 		flags << '*';
 | ||
| 	if (fld().roman())
 | ||
| 		flags << 'M';
 | ||
| 	if (fld().right_justified())
 | ||
| 		flags << 'R';
 | ||
|   if (fld().uppercase())
 | ||
| 		flags << 'U';
 | ||
| 	
 | ||
| 	byte trim = fld().trim();
 | ||
| 
 | ||
| 	if (trim == 0)
 | ||
| 	  flags << '_';
 | ||
| 	else
 | ||
| 		if (trim == 1)
 | ||
| 			flags << '@';
 | ||
| 		else
 | ||
| 			if (trim == 2)
 | ||
| 				flags << '#';
 | ||
| 
 | ||
| 	TEdit_field & e = add_string(101, 0, "", 1, 0, fld().size(), flags);
 | ||
| 
 | ||
| 	e.set_read_only(true);
 | ||
|   e.allow_pipe(fld().pipe_allowed());
 | ||
| 
 | ||
| 	create_keyboard_row(1, "1234567890'<27>\b\27");
 | ||
| 	create_keyboard_row(3, "qwertyuiop<EFBFBD>+\n\06");
 | ||
| 	create_keyboard_row(5, "\01asdfghjkl<EFBFBD><EFBFBD><EFBFBD>\04\05");
 | ||
| 	create_keyboard_row(7,"\02<zxcvbnm,.- \03");
 | ||
| }
 | ||
| 
 | ||
| TVirtual_keyboard::TVirtual_keyboard(TMask_field & fld, int cols, int rows)
 | ||
| 									: TMask(fld.prompt(), 1, cols, rows), _fld(fld)
 | ||
| 
 | ||
| {
 | ||
| 	int size = fld.size();
 | ||
| 	
 | ||
|   RCT f, m, k;
 | ||
| 
 | ||
| 	fld.get_rect(f);
 | ||
| 	xvt_vobj_get_client_rect(fld.parent(), &m);
 | ||
| 	xvt_vobj_get_outer_rect(win(), &k);
 | ||
| 
 | ||
| 	int height = xvt_rect_get_height(&k);
 | ||
|   int width = xvt_rect_get_width(&k);
 | ||
| 	int ypos = f.bottom + 3;
 | ||
| 	int xpos = f.left ;
 | ||
| 
 | ||
| 	if (ypos + height > m.bottom)
 | ||
| 		ypos = f.top - 10 - height - xvt_vobj_get_attr(win(), ATTR_TITLE_HEIGHT); // attualmente wxWidget ignora i titoli
 | ||
| 
 | ||
| 
 | ||
| 	if (xpos + width > m.right)
 | ||
| 		xpos = f.right - width;
 | ||
| 	if (xpos < 0)
 | ||
| 		xpos = 20;
 | ||
| 
 | ||
| 	k.top = ypos;
 | ||
| 	k.bottom = ypos + height;
 | ||
| 	k.left = xpos;
 | ||
| 	k.right = xpos + width;
 | ||
| 	xvt_vobj_move(win(), &k);
 | ||
| }
 | ||
| 
 | ||
| void TVirtual_numpad::init()
 | ||
| {
 | ||
| 	TString flags;
 | ||
| 
 | ||
| 	if (fld().password())
 | ||
| 		flags << '*';
 | ||
| 	if (fld().roman())
 | ||
| 		flags << 'M';
 | ||
| 	if (fld().right_justified())
 | ||
| 		flags << 'R';
 | ||
|   if (fld().uppercase())
 | ||
| 		flags << 'U';
 | ||
|   	
 | ||
| 	byte trim = fld().trim();
 | ||
| 
 | ||
| 	if (trim == 0)
 | ||
| 	  flags << '_';
 | ||
| 	else
 | ||
| 		if (trim == 1)
 | ||
| 			flags << '@';
 | ||
| 		else
 | ||
| 			if (trim == 2)
 | ||
| 				flags << '#';
 | ||
| 
 | ||
| 	if (_currency )
 | ||
| 		add_currency(101, 0, "", 1, 0, fld().size(), flags);
 | ||
| 	else
 | ||
| 		add_number(101, 0, "", 1, 0, fld().size(), flags, ((TReal_field& )fld()).decimals());
 | ||
| 
 | ||
| 	field(101).set_read_only(true);
 | ||
|   field(101).allow_pipe(fld().pipe_allowed());
 | ||
| 
 | ||
| 	create_keyboard_row(1, "789\b");
 | ||
| 	create_keyboard_row(3, "456-\06");
 | ||
| 	create_keyboard_row(5, "123\04\05");
 | ||
| 	create_keyboard_row(7, "0,\n\27");
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| TVirtual_numpad::TVirtual_numpad(TMask_field & fld, bool currency, int cols, int rows)
 | ||
| 								: TVirtual_keyboard(fld, cols, rows), _currency(currency)
 | ||
| 
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| 
 |