⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htdialog.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 4 页
字号:
			*selstart = *text;			*selend = *text+*textlen;		} else {			*selstart = 0;			*selend = 0;		}		ofs = 0;	}	//	s->recordEnd(h);	dirtyview();}/* *	CLASS ht_strinputfield */void ht_strinputfield::init(Bounds *b, int maxstrlen, List *history){	ht_inputfield::init(b, maxstrlen, history);	VIEW_DEBUG_NAME("ht_strinputfield");	is_virgin = true;	selectmode = false;}void ht_strinputfield::done(){	ht_inputfield::done();}void ht_strinputfield::correct_viewpoint(){	if (*curchar - *text < ofs) {		ofs = *curchar-*text; 	} else {		if (*curchar - *text - (size.w-2)*size.h+1 > ofs) {			ofs = *curchar-*text-(size.w-2)*size.h+1;		}	}}void ht_strinputfield::draw(){	int c=focused ? getcolor(palidx_generic_input_focused) :		getcolor(palidx_generic_input_unfocused);	byte *t = *text + ofs;	int l = *textlen - ofs;	if (l > size.w) l = size.w;	int y = 0;	fill(0, 0, size.w, size.h, c, ' ');	if (ofs) buf->printChar(0, y, getcolor(palidx_generic_input_clip), '<');	for (int k=0; k < *textlen-ofs; k++) {		if (1+k-y*(size.w-2) > size.w-2) {			if (y+1 < size.h) y++; else break;		}		if (t < *selstart || t >= *selend) {			buf->printChar(1+k-y*(size.w-2), y, c, *(t++));		} else {			buf->printChar(1+k-y*(size.w-2), y, getcolor(palidx_generic_input_selected), *(t++));		}	}	if (*textlen-ofs > (size.w-2)*size.h) {		buf->printChar(size.w-1, y, getcolor(palidx_generic_input_clip), '>');	}	if (history && history->count()) {		buf->printChar(size.w-1, y+size.h-1, getcolor(palidx_generic_input_clip), GC_SMALL_ARROW_DOWN, CP_GRAPHICAL);	}	if (focused) {		int cx, cy;		if (*curchar-*text-ofs >= (size.w-2)*size.h) {			cx = size.w-1;			cy = size.h-1;		} else {			cx = (*curchar - *text - ofs) % (size.w-2)+1;			cy = (*curchar - *text - ofs) / (size.w-2);		}		setcursor(cx, cy, insert ? CURSOR_NORMAL : CURSOR_BOLD);	}}void ht_strinputfield::handlemsg(htmsg *msg){	if (msg->type == mt_empty && msg->msg == msg_keypressed) {		int k = msg->data1.integer;		switch (k) {			case K_Meta_S:				selectmode = !selectmode;				clearmsg(msg);				break;			case K_Up:				is_virgin = false;				if (*curchar - *text - ofs < size.w - 2) {					ofs -= size.w-2;					if (ofs < 0) ofs=0;				}				*curchar -= size.w-2;				if (*curchar < *text) *curchar = *text;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Down:				is_virgin = false;				if (*curchar + size.w - 2 - *text > *textlen) {					history_dialog();					clearmsg(msg);					return;				} else {					*curchar += size.w-2;					if (*curchar - *text > *textlen) {						*curchar = *text + *textlen;					}					correct_viewpoint();					dirtyview();				}				clearmsg(msg);				return;			case K_Shift_Left:			case K_Left:				is_virgin = false;				if (*curchar>*text) {					(*curchar)--;					if ((k==K_Shift_Left) != selectmode) {						select_add(*curchar, *curchar+1);					}				}				    				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Shift_Right:							case K_Right:				is_virgin = false;				if (*curchar-*text<*textlen) {					(*curchar)++;					if ((k==K_Shift_Right) != selectmode) {						select_add(*curchar-1, *curchar);					}				}									correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Backspace:				if (is_virgin) {					is_virgin = false;					*selstart = 0;					*selend = 0;					*textlen = 0;					*curchar = *text;					dirtyview();					clearmsg(msg);				} else if (*curchar > *text) {					*selstart = 0;					*selend = 0;					memmove(*curchar-1, *curchar, *textlen-(*curchar-*text));					(*textlen)--;					(*curchar)--;					is_virgin=0;					correct_viewpoint();					dirtyview();					clearmsg(msg);					return;				}				break;			case K_Delete:				if (is_virgin) {					is_virgin = false;					*selstart = 0;					*selend = 0;					*textlen = 0;					*curchar = *text;					dirtyview();					clearmsg(msg);				} else if (*curchar-*text < *textlen && *textlen) {					if (*selstart) {						if (*curchar >= *selstart) {							if (*curchar < *selend) (*selend)--;							if (*selstart == *selend) {								*selstart=0;								*selend=0;							}						} else {							(*selstart)--;							(*selend)--;						}					}					memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1);					(*textlen)--;					dirtyview();					clearmsg(msg);					return;				}				break;			case K_Shift_Home:			case K_Home:				is_virgin = false;				if ((k == K_Shift_Home) != selectmode) {					select_add(*curchar, *text);				}									*curchar = *text;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Shift_End:			case K_End:				is_virgin = false;				if ((k == K_Shift_End) != selectmode) {					select_add(*curchar, *text+*textlen);				}										*curchar = *text + *textlen;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Insert:				insert=!insert;				dirtyview();				clearmsg(msg);				return;			case K_Meta_X:			case K_Shift_Delete:				if (*selend > *selstart) clipboard_copy("inputfield", *selstart, *selend-*selstart);			case K_Meta_D:			case K_Control_Delete:				if (*selend > *selstart) {					memmove(*selstart, *selend, *textlen-(*selend-*text));					*textlen -= *selend - *selstart;					*curchar = *selstart;					*selstart = 0;					*selend = 0;					is_virgin = false;					correct_viewpoint();				}				dirtyview();				clearmsg(msg);				return;			case K_Meta_C:			case K_Control_Insert:				if (*selend > *selstart) clipboard_copy("inputfield", *selstart, *selend-*selstart);				is_virgin = false;				dirtyview();				clearmsg(msg);				return;			case K_Meta_V:			case K_Shift_Insert: {				int maxsize = MIN(*maxtextlen-*textlen, (int)clipboard_getsize());				byte *buf = ht_malloc(maxsize);				int r = clipboard_paste(buf, maxsize);				if (r) {					for (int i=0; i < r; i++) {						setbyte(buf[r-i-1]);					}					*selstart=*curchar;					*selend=*curchar+r;				}				delete buf;				is_virgin = false;				dirtyview();				clearmsg(msg);				return;			}			default:				if (msg->data1.integer >= ' ' && msg->data1.integer < 256) {					if (is_virgin) {						is_virgin = false;						*selstart = 0;						*selend = 0;						*textlen = 0;						*curchar = *text;						ofs = 0;					}					inputbyte(msg->data1.integer);					dirtyview();					clearmsg(msg);					return;				}		}	}	ht_inputfield::handlemsg(msg);}void ht_strinputfield::history_dialog(){	if (history && history->count()) {		Bounds b;		getbounds(&b);		b.y--;		b.h=8;		ht_history_popup_dialog *l=new ht_history_popup_dialog();		l->init(&b, history);		if (l->run(false)) {			ht_listpopup_dialog_data d;			ViewDataBuf vdb(l, &d, sizeof d);			if (d.cursor_string) {				ht_history_entry *v=(ht_history_entry*)(*history)[d.cursor_pos];				if (v->data && group) {					v->datafile->seek(0);					group->setdata(*v->data);				} else {					ht_inputfield_data e;					e.textlen = strlen(d.cursor_string);					e.text = (byte*)d.cursor_string;					databuf_set(&e, sizeof e);				}			}			is_virgin = false;		}		l->done();		delete l;	}}void ht_strinputfield::receivefocus(){	correct_viewpoint();	ht_inputfield::receivefocus();}bool ht_strinputfield::inputbyte(byte a){	if (setbyte(a)) {		(*curchar)++;		correct_viewpoint();		is_virgin = false;		return true;	}	return false;}bool ht_strinputfield::setbyte(byte a){	if (insert || *curchar-*text >= *textlen) {		if (insertbyte(*curchar, a) && *curchar-*text<*textlen) return true;	} else {		**curchar=a;		return true;	}	return false;}/* *	CLASS ht_hexinputfield */void ht_hexinputfield::init(Bounds *b, int maxstrlen){	ht_inputfield::init(b, maxstrlen);	VIEW_DEBUG_NAME("ht_strinputfield");	nib=0;	insert=1;}void ht_hexinputfield::done(){	ht_inputfield::done();}void ht_hexinputfield::correct_viewpoint(){	if (*curchar-*text<ofs) {		ofs = *curchar-*text; 	} else if ((*curchar-*text)*3-(size.w-2)*size.h+5>ofs*3) {		ofs = ((*curchar-*text)*3-(size.w-2)*size.h+5) / 3;	}}void ht_hexinputfield::draw(){	int c=focused ? getcolor(palidx_generic_input_focused) :		getcolor(palidx_generic_input_unfocused);	char hbuf[256], *h=hbuf;	int y=0;	fill(0, 0, size.w, size.h, c, ' ');	if (ofs) buf->print(0, y, getcolor(palidx_generic_input_clip), "<");	int vv=*textlen-ofs;	if (vv<0) vv=0; else if (vv>(size.w-2)*size.h/3) vv=(size.w-2)*size.h/3+1;	for (int k=0; k<vv; k++) {		h += sprintf(h, "%02x ", *(*text+k+ofs));	}	if (vv) {		h = hbuf;		while (*h && y < size.h) {			h += buf->nprint(1, y, c, h, size.w-2);			y++;		}		y--;	}	if ((*textlen-ofs)*3 > (size.w-2)*size.h) {		buf->print(size.w-1, y, getcolor(palidx_generic_input_clip), ">");	}	if (focused) {		int cx, cy;		if ((*curchar-*text-ofs)*3+nib+1 >= (size.w-2)*size.h) {			cx = size.w-1;			cy = size.h-1;		} else {			cx = ((*curchar-*text-ofs)*3+nib+1) % (size.w-2);			cy = ((*curchar-*text-ofs)*3+nib+1) / (size.w-2);		}		setcursor(cx, cy, insert ? CURSOR_NORMAL : CURSOR_BOLD);	}}void ht_hexinputfield::handlemsg(htmsg *msg){	if (msg->msg==msg_keypressed) {		switch (msg->data1.integer) {			case K_Up:				if (*curchar-*text-ofs<(size.w-2)/3) {					ofs-=(size.w-2)/3;					if (ofs<0) ofs=0;				}				*curchar-=(size.w-2)/3;				if (*curchar<*text) *curchar=*text;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Down:/*				if (*curchar-*text-ofs>=(size.w-2)*(size.h-1)/3) {					ofs+=(size.w-2)/3;				}*/				*curchar+=(size.w-2)/3;				if (*curchar-*text>*textlen) *curchar=*text+*textlen;				if (*curchar-*text>=*textlen) nib=0;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Left:				if (nib) {					nib=0;				} else if (*curchar>*text) {					(*curchar)--;					nib=1;				}				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Right:				if (!nib) {					if (*curchar-*text<*textlen) nib=1;				} else if (*curchar-*text<*textlen) {					(*curchar)++;					nib=0;				}				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Backspace:				if (*textlen) {					if (*curchar+nib>*text) {/*						if (*curchar-*text<*textlen) {							memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1);						}					} else {*/						memmove(*curchar-1+nib, *curchar+nib, *textlen-(*curchar-*text));						(*textlen)--;						if (*curchar-*text && !nib) (*curchar)--;						nib=0;						correct_viewpoint();						dirtyview();					}					clearmsg(msg);					return;				}				break;			case K_Delete:				if ((*curchar-*text<*textlen) && (*textlen)) {					memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1);					(*textlen)--;					nib=0;					dirtyview();					clearmsg(msg);					return;				}				break;			case K_Home:				*curchar=*text;				nib=0;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_End:				*curchar=*text+*textlen;				nib=0;				correct_viewpoint();				dirtyview();				clearmsg(msg);				return;			case K_Insert:				insert=!insert;				dirtyview();				clearmsg(msg);				return;			default:				if ((msg->data1.integer>='0') && (msg->data1.integer<='9')) {					setnibble(msg->data1.integer-'0');					dirtyview();					clearmsg(msg);				} else if ((msg->data1.integer>='a') && (msg->data1.integer<='f')) {					setnibble(msg->data1.integer-'a'+10);					dirtyview();					clearmsg(msg);				}				return;		}	}	ht_inputfield::handlemsg(msg);}void ht_hexinputfield::receivefocus(){	correct_viewpoint();	if (nib && *curchar-*text == *textlen) {		nib=0;	}	ht_inputfield::receivefocus();}void ht_hexinputfield::setnibble(byte a){	if ((insert || *curchar-*text >= *textlen) && nib == 0) {		if ((insertbyte(*curchar, a<<4)) && (*curchar-*text<*textlen)) nib=1;	} else {		if (nib) {			**curchar=(**curchar & 0xf0) | a;			(*curchar)++;			nib=0;		} else {			**curchar=(**curchar & 0xf) | (a<<4);			nib=1;		}	}	correct_viewpoint();}/* *	CLASS ht_button */void ht_button::init(Bounds *b, const char *Text, int Value){	ht_view::init(b, VO_SELECTABLE | VO_OWNBUFFER | VO_POSTPROCESS, "some button");	VIEW_DEBUG_NAME("ht_button");	value = Value;	text = ht_strdup(Text);	pressed = 0;	magicchar = strchr(text, '~');	if (magicchar) {		int l = strlen(text);		memmove(magicchar, magicchar+1, l-(magicchar-text));		shortcut1 = keyb_metakey((ht_key)tolower(*magicchar));		shortcut2 = (ht_key)tolower(*magicchar);	} else {		shortcut1 = K_INVALID;		shortcut2 = K_INVALID;	}}void ht_button::done(){	free(text);	ht_view::done();}void ht_button::getminbounds(int *width, int *height){	*width = 6;	*height = 2;}const char *ht_button::defaultpalette(){	return palkey_generic_dialog_default;}void ht_button::draw(){	int c=focused ? getcolor(palidx_generic_button_focused) :		getcolor(palidx_generic_button_unfocused);	fill(0, 0, size.w-1, size.h-1, c, ' ');	int xp = (size.w - strlen(text))/2, yp = (size.h-1)/2;	buf->print(xp, yp, c, text);	if (magicchar) buf->printChar(xp+(magicchar-text), yp, getcolor(palidx_generic_button_shortcut), *magicchar);	/* shadow */	buf->printChar(0, 1, getcolor(palidx_generic_button_shadow), ' ');	for (int i=1; i<size.w-1; i++) {		buf->printChar(i, 1, getcolor(palidx_generic_button_shadow), GC_FILLED_UPPER, CP_GRAPHICAL);	}	buf->printChar(size.w-1, 0, getcolor(palidx_generic_button_shadow), GC_FILLED_LOWER, CP_GRAPHICAL);	buf->printChar(size.w-1, 1, getcolor(palidx_generic_button_shadow), GC_FILLED_UPPER, CP_GRAPHICAL);}void ht_button::handlemsg(htmsg *msg){	if (msg->type == mt_postprocess) {		if (msg->msg == msg_keypressed) {			if ((shortcut1 != K_INVALID && msg->data1.integer==shortcut1) ||			(shortcut2 != K_INVALID && msg->data1.integer==shortcut2)) {				push();				dirtyview();				clearmsg(msg);				return;			}		}	} else if (msg->type == mt_empty) {		if (msg->msg == msg_keypressed) {			switch (msg->data1.integer) {			case K_Return:			case K_Space:				push();				dirtyview();				clearmsg(msg);				return;			}		}	}	ht_view::handlemsg(msg);}void ht_button::push(){	/* FIXME: wont work for encapsulated buttons... */	/* FIXME: (thats why I hacked this now...) */	app->sendmsg(msg_button_pressed, value);//	baseview->sendmsg(msg_button_pressed, value);	// why not like this ?	pressed=1;}/* *	CLASS ht_listbox_title */void	ht_listbox_title::init(Bounds *b){	ht_view::init(b, VO_RESIZE, "ht_listbox_title");	growmode = MK_GM(GMH_FIT, GMV_TOP);	texts = NULL;	listbox = NULL;	cols = 0;}void	ht_listbox_title::done(){	if (texts) {		for (int i=0; i < cols; i++) {			free(texts[i]);		}		free(texts);	}	ht_view::done();}const char *ht_listbox_title::defaultpalette(){	return palkey_generic_dialog_default;}void ht_listbox_title::draw(){	vcp color = getTextColor();	clear(color);	if (!texts || !listbox) return;	int x = 0;	for (int i=0; i < cols; i++) {     		buf->nprint(x, 0, color, texts[i], size.w - x);		x += listbox->widths[i];		if (i+1 < cols) {			if (x >= size.w) break;			buf->printChar(x++, 0, color, ' ');			if (x >= size.w) break;			buf->printChar(x++, 0, color, GC_1VLINE, CP_GRAPHICAL);			if (x >= size.w) break;			buf->printChar(x++, 0, color, ' ');		}	}}vcp ht_listbox_title::getTextColor(){	return getcolor(palidx_generic_body);}void ht_listbox_title::setText(int cols, ...){	va_list vargs;	va_start(vargs, cols);	setTextv(cols, vargs);	va_end(vargs);}void ht_listbox_title::setTextv(int c, va_list vargs){	if (texts) {		for (int i=0; i<cols; i++) {			free(texts[i]);		}		free(texts);	}	texts = NULL;	cols = c;	if (!c) return;	texts = ht_malloc(c * sizeof(char*));	for (int i=0; i<cols; i++) {		texts[i] = ht_strdup(va_arg(vargs, char*));	}	update();}void ht_listbox_title::update(){	if (texts && listbox && listbox->widths) {		for (int i=0; i<cols; i++) {			int s = strlen(texts[i]);			if (s > listbox->widths[i]) listbox->widths[i] = s;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -