📄 htformat.cc
字号:
clearmsg(msg); return; case K_Control_Right: xscroll+=2; dirtyview(); clearmsg(msg); return; case K_Control_PageUp: { top.sub = first_sub; if (top.sub) { vstate_save(); select_mode_pre(); top.sub->first_line_id(&top.line_id); uformat_viewer_pos p = top; p.tag_group = cursor.tag_group; if (find_first_tag(&p, size.h)) { set_cursor(p); } else { cursor_ypos = 0x7fffffff; update_misc_info(); update_visual_info(); check_cursor_visibility(); } select_mode_post(0); } clearmsg(msg); dirtyview(); return; } case K_Control_PageDown: { top.sub = last_sub; if (top.sub) { vstate_save(); select_mode_pre(); top.sub->last_line_id(&top.line_id); uformat_viewer_pos p = top; p.tag_group = cursor.tag_group; if (find_first_tag(&p, 1)) { set_cursor(p); } else { cursor_ypos = 0x7fffffff; update_misc_info(); update_visual_info(); check_cursor_visibility(); } cursor_up(size.h); cursor_down(size.h); select_mode_post(0); } clearmsg(msg); dirtyview(); return; } case K_Shift_Up: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class == tag_class_edit) s = cursor_tag_offset; else s = (sel_end > sel_start) ? sel_end : -1ULL; e = get_current_tag_size(&ts) ? s+ts : -1ULL; cursor_up(1); if (s != -1ULL) { if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Shift_Down: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class == tag_class_edit) s = cursor_tag_offset; else s = (sel_end > sel_start) ? sel_end : -1ULL; e = get_current_tag_size(&ts) ? s+ts : -1ULL; cursor_down(1); if (s != -1ULL) { if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Shift_Left: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class==tag_class_edit) s = cursor_tag_offset; else s = sel_end > sel_start ? sel_end : -1ULL; e = get_current_tag_size(&ts) ? s+ts : -1ULL; int r; if (edit()) r = cursormicro_backward(); else r = cursor_left(); if (s != -1ULL && r) { if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Shift_Right: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class == tag_class_edit) s = cursor_tag_offset; else s = (sel_end > sel_start) ? sel_end : -1ULL; e=get_current_tag_size(&ts) ? s+ts : -1ULL; int r; if (edit()) r = cursormicro_forward(); else r = cursor_right(); if (s != -1ULL) { if (r) { if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } else { if (cursor_tag_class == tag_class_edit && sel_end != e) { pselect_add(s, e); } } } clearmsg(msg); dirtyview(); return; } case K_Shift_PageUp: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class == tag_class_edit) s = cursor_tag_offset; else s = (sel_end > sel_start) ? sel_end : -1ULL; e = get_current_tag_size(&ts) ? s+ts : -1ULL; cursor_up(size.h); if (s != -1ULL) { if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Shift_PageDown: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class==tag_class_edit) s=cursor_tag_offset; else s=(sel_end>sel_start) ? sel_end : -1ULL; e=get_current_tag_size(&ts) ? s+ts : -1ULL; cursor_down(size.h); if (s != -1ULL) { if (cursor_tag_class==tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Shift_Home: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class==tag_class_edit) s=cursor_tag_offset; else s=(sel_end>sel_start) ? sel_end : -1ULL; e=get_current_tag_size(&ts) ? s+ts : -1ULL; int r=cursor_home(); if (s != -1ULL && r) { if (cursor_tag_class == tag_class_edit) { pselect_add(cursor_tag_offset, s); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(e, s); } } clearmsg(msg); dirtyview(); return; } case K_Shift_End: { focus_cursor(); FileOfs s, e; uint32 ts; if (cursor_tag_class==tag_class_edit) s=cursor_tag_offset; else s=(sel_end>sel_start) ? sel_end : -1ULL; e=get_current_tag_size(&ts) ? s+ts : -1ULL; int r=cursor_end(); if (s != -1ULL && r){ if (cursor_tag_class == tag_class_edit) { pselect_add(s, cursor_tag_offset); } else if (cursor_tag_class == tag_class_sel && e != -1ULL) { pselect_add(s, e); } } clearmsg(msg); dirtyview(); return; } case K_Control_F: if (caps & VC_SEARCH) { sendmsg(cmd_file_search); dirtyview(); clearmsg(msg); return; } break; case K_Control_L: case K_Shift_F7: if (caps & VC_SEARCH) { if (!continue_search()) { if (last_search_request) { infobox("no further matches"); } else { infobox("you must 'search' first!"); } } dirtyview(); clearmsg(msg); return; } break; case K_Meta_C: case K_Control_Insert: sendmsg(cmd_edit_copy); dirtyview(); clearmsg(msg); return; case K_Meta_V: case K_Shift_Insert: sendmsg(cmd_edit_paste); dirtyview(); clearmsg(msg); return; case K_Escape: if (caps & VC_EDIT) { baseview->sendmsg(cmd_view_mode_i, file, NULL); return; } break; default: { if (((uint32)msg->data1.integer<=255) && (edit())) { if (cursor_tag_class==tag_class_edit) { focus_cursor(); if (edit_input(msg->data1.integer)) { dirtyview(); clearmsg(msg); return; } } } } } break; case cmd_edit_copy: if (sel_end > sel_start) { char dsc[1024]; String fn; ht_snprintf(dsc, sizeof dsc, "%y::%s", &file->getFilename(fn), desc); clipboard_copy(dsc, file, sel_start, sel_end-sel_start); } clearmsg(msg); return; case cmd_edit_paste: FileOfs ofs; if (get_current_offset(&ofs)) { baseview->sendmsg(cmd_edit_mode_i, file, NULL); if (file->getAccessMode() & IOAM_WRITE) { FileOfs s = clipboard_paste(file, ofs); if (s) { pselect_set(ofs, ofs+s); sendmsg(cmd_edit_mode_i); } } } dirtyview(); clearmsg(msg); return; case cmd_edit_mode: edit_start(); dirtyview(); return; case cmd_view_mode: edit_end(); dirtyview(); return; case cmd_file_goto: { char addrstr[1024]; addrstr[0] = 0; while (address_input("goto", addrstr, sizeof addrstr, HISTATOM_GOTO) != button_cancel) { if (addrstr[0]) { viewer_pos pos; globalerror[0] = 0; if (string_to_pos(addrstr, &pos) && goto_pos(pos, this)) { focus_cursor(); break; } if (globalerror[0]) { infobox("error: %s\nin '%s'", globalerror, addrstr); } else { infobox("invalid address: '%s'", addrstr); } } } clearmsg(msg); dirtyview(); return; } case cmd_file_search: { viewer_pos start_pos, end_pos; get_current_pos(&start_pos); clear_viewer_pos(&end_pos); end_pos.u.sub = last_sub; end_pos.u.tag_idx = -1; last_sub->last_line_id(&end_pos.u.line_id); ht_search_request *request = search_dialog(this, search_caps, &start_pos, &end_pos); ht_search_result *result = NULL; if (request) { switch (request->search_class) { case SC_PHYSICAL: { try { FileOfs start, end; if (pos_to_offset(start_pos, &start)) { if (!pos_to_offset(end_pos, &end)) { end = FileOfs(-1); } result = psearch(request, start, end); } } catch (const Exception &e) { errorbox("error: %y", &e); } break; } case SC_VISUAL: { try { result = vsearch(request, start_pos, end_pos); } catch (const Exception &e) { errorbox("error: %y", &e); } break; } } delete request; if (result) { // FIXME: !!!!!!!! if (!show_search_result(result)) infobox("couldn't display result (internal error)"); delete result; } else infobox("not found"); } clearmsg(msg); dirtyview(); return; } case cmd_file_replace: { sendmsg(cmd_edit_mode_i); if (edit()) { bool cancel; FileOfs s = get_file()->getSize(); uint repls = replace_dialog(this, search_caps, &cancel); if (repls) { if (s != get_file()->getSize()) { sendmsg(msg_filesize_changed); } infobox("%d replacement(s) made", repls); } } clearmsg(msg); dirtyview(); return; } case msg_filesize_changed: { htmsg m; m.msg = msg_filesize_changed; m.type = mt_broadcast; sendsubmsg(&m); break; } case cmd_file_save: { if (edit()) edit_update(); clearmsg(msg); return; } case cmd_file_resize: { FileOfs o = 0; if (get_current_offset(&o)) { uint32 s; if (get_current_tag_size(&s)) { o += s; } } if (!o) o = clipboard_getsize(); FileOfs s = file->getSize(); char buf[32]; ht_snprintf(buf, sizeof buf, "%qd", o); if (inputbox("resize", "new file size", buf, sizeof buf, 0)==button_ok) { eval_scalar r; if (eval(&r, buf, NULL, NULL, NULL)) { eval_int i; scalar_context_int(&r, &i); scalar_destroy(&r); o = i.value; if (o < s) { /* truncate */ htmsg m; m.msg = cmd_file_truncate; m.type = mt_broadcast; m.data1.ptr = file; m.data2.q = o; baseview->sendmsg(&m); m.msg = msg_filesize_changed; m.type = mt_broadcast; sendsubmsg(&m); sendmsg(&m); } else if (o>s) { /* extend */ htmsg m; m.msg = cmd_file_extend; m.type = mt_broadcast; m.data1.ptr = file; m.data2.q = o; baseview->sendmsg(&m); m.msg = msg_filesize_changed; m.type = mt_broadcast; sendsubmsg(&m); sendmsg(&m); } } else { const char *errmsg="?"; int errpos=0; get_eval_error(&errmsg, &errpos); errorbox("eval error: %s at %d\n in '%s'", errmsg, errpos, buf); } update_misc_info(); } clearmsg(msg); dirtyview(); return; } case cmd_file_blockop: { if (sel_end>sel_start) { blockop_dialog(this, sel_start, sel_end); } else { FileOfs o = 0; get_current_offset(&o); blockop_dialog(this, o, file->getSize()); } clearmsg(msg); dirtyview(); return; } } ht_format_viewer::handlemsg(msg);}void ht_uformat_viewer::insertsub(ht_sub *sub){ if (last_sub) last_sub->next = sub; sub->uformat_viewer = this; sub->prev = last_sub; last_sub = sub; if (!first_sub) first_sub = sub;}bool ht_uformat_viewer::goto_offset(FileOfs offset, bool save_vstate){ uformat_viewer_pos p; p.sub = first_sub; p.tag_group = cursor.tag_group; while (p.sub) { if (p.sub->convert_ofs_to_id(offset, &p.line_id)) { if (save_vstate) vstate_save(); switch (cursor_state) { case cursor_state_visible: { select_mode_pre(); /* FIXME: magic 42 */ if (!find_first_edit_tag_with_offset(&p, 42, offset) && !find_first_tag(&p, size.h)) break; bool r = set_cursor(p); select_mode_post(false); return r; } case cursor_state_invisible: select_mode_pre(); p.tag_group = -1; p.tag_idx = -1; bool r = set_cursor(p); select_mode_post(false); return r; } break; } p.sub = p.sub->next; } return false;}bool ht_uformat_viewer::goto_pos(viewer_pos pos, bool save_vstate){ if (save_vstate) vstate_save(); select_mode_pre(); set_cursor(pos.u); select_mode_post(false); return true;}bool ht_uformat_viewer::next_logical_pos(viewer_pos pos, viewer_pos *npos){ if (next_line(&pos.u, 1) == 1) { *npos = pos; return true; } return false;}bool ht_uformat_viewer::next_logical_offset(FileOfs ofs, FileOfs *nofs){ *nofs = ofs + 1; return true;}int ht_uformat_viewer::next_line(uformat_viewer_pos *p, int n){ int n0 = n; while (n) { if (n -= p->sub->next_line_id(&p->line_id, n)) { if (!p->sub->next) return n0 - n; p->sub = p->sub->next; p->sub->first_line_id(&p->line_id); p->tag_idx = -1; n--; } } ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -