📄 htformat.cc
字号:
case 2: k = q.tm_min % 10 + h * 10; if (k < 60) { q.tm_min = k; worked = true; } break; case 3: k = q.tm_min - q.tm_min % 10 + h; if (k < 60) { q.tm_min = k; worked = true; } break; case 4: k = q.tm_sec % 10 + h * 10; if (k < 60) { q.tm_sec = k; worked = true; } break; case 5: k = q.tm_sec - q.tm_sec % 10 + h; if (k < 60) { q.tm_sec = k; worked = true; } break; case 6: k = (q.tm_mday % 10) + h * 10; if (k <= 31) { q.tm_mday = k; worked = true; } break; case 7: k = q.tm_mday - q.tm_mday % 10 + h; if (k <= 31) { q.tm_mday = k; worked = true; } break; case 8: k = (q.tm_mon+1) % 10 + h * 10; if (k <= 12) { q.tm_mon = k-1; worked = true; } break; case 9: k = q.tm_mon - q.tm_mon % 10 + h; if (k <= 12) { q.tm_mon = k-1; worked = true; } break; case 10: k = DEC_MASK(q.tm_year, 1000) + h * 1000; if ((k+1900 >= 1970 ) && (k+1900 < 2106)) { q.tm_year = k; worked = true; } break; case 11: k = DEC_MASK(q.tm_year, 100) + h * 100; if ((k+1900 >= 1970 ) && (k+1900 < 2106)) { q.tm_year = k; worked = true; } break; case 12: k = DEC_MASK(q.tm_year, 10) + h * 10; if ((k+1900 >= 1970 ) && (k+1900 < 2106)) { q.tm_year = k; worked = true; } break; case 13: k = DEC_MASK(q.tm_year, 1) + h * 1; if ((k+1900 >= 1970 ) && (k+1900 < 2106)) { q.tm_year = k; worked = true; } break; } /* FIXME: big bad hack... */ if (sizeof(uint32) == sizeof(time_t)) if (worked) { /* FIXME: !!! */ uint32 tz; time_t l = time(NULL); time_t g = l; struct tm *gtm = gmtime(&g); g = mktime(gtm); tz = (uint32)difftime(g, l); time_t tt = mktime(&q); d = tt; d -= tz; if (t[1] == HT_TAG_EDIT_TIME_LE) { buf[0] = d>>0; buf[1] = d>>8; buf[2] = d>>16; buf[3] = d>>24; } else { buf[3] = d>>0; buf[2] = d>>8; buf[1] = d>>16; buf[0] = d>>24; } pwrite(cursor_tag_offset, &buf, 4); cursormicroedit_forward(); return true; } } } } return false;}int ht_uformat_viewer::edit_input_c2h(byte b){ int h = -1; if (b >= '0' && b <= '9') { h = b-'0'; } else if (b >= 'a' && b <= 'f') { h = b-'a'+10; } else if (b >= 'A' && b <= 'F') { h = b-'A'+10; } return h;}int ht_uformat_viewer::edit_input_c2d(byte b){ int h = -1; if (b >= '0' && b <= '9') { h = b-'0'; } return h;}void ht_uformat_viewer::edit_input_correctpos(){ uformat_viewer_pos p = top; /* try finding edited tag by its offset */ char c_line[1024]; int g=cursor.tag_group; for (int y=0; y < size.h+10; y++) { if (!p.sub->getline(c_line, sizeof c_line, p.line_id)) break; int c = tag_count_selectable_tags_in_group(c_line, cursor.tag_group); for (int i=0; i < c; i++) { char *t = tag_get_selectable_tag(c_line, i, cursor.tag_group); if (tag_get_class(t) == tag_class_edit && tag_get_offset(t) == cursor_tag_offset) { set_cursor(p); cursorline_dirty(); cursor.tag_idx = i; cursor.tag_group = g; update_misc_info(); update_visual_info(); return; } } if (!next_line(&p, 1)) break; } /* try finding edited tag by cursor_ypos */ p = top; next_line(&p, cursor_ypos); int ci = cursor.tag_idx; set_cursor(p); cursorline_dirty(); cursorline_get(); int x = tag_count_selectable_tags(cursor_line); if (ci >= x) ci = x-1; cursor.tag_idx = ci; update_misc_info(); update_visual_info();}bool ht_uformat_viewer::edit_start(){ if (edit() && cursor.sub) { cursor_tag_micropos=0; cursorline_dirty(); adjust_cursor_idx(); update_visual_info(); update_misc_info(); dirtyview(); return true; } return false;}bool ht_uformat_viewer::edit_update(){ if (edit()) { file->cntl(FCNTL_MODS_FLUSH); dirtyview(); return true; } return false;}bool ht_uformat_viewer::find_first_tag(uformat_viewer_pos *p, int limit){ char line[1024]; int i=0; uformat_viewer_pos q = *p; if (!q.sub) return false; do { q.sub->getline(line, sizeof line, q.line_id); if (tag_get_selectable_tag(line, 0, 0)) { *p = q; p->tag_idx = 0; p->tag_group = 0; return true; } } while ((next_line(&q, 1)) && (i++<limit)); return false;}bool ht_uformat_viewer::find_first_edit_tag_with_offset(uformat_viewer_pos *p, int limit, FileOfs offset){ char line[1024]; int i=0; uformat_viewer_pos q = *p; if (!q.sub) return false; do { q.sub->getline(line, sizeof line, q.line_id); int c = tag_count_selectable_tags(line); char *t = line; for (int j=0; j<c; j++) { t = tag_get_selectable_tag(t, 0, -1); if (tag_get_class(t) == tag_class_edit && tag_get_offset(t) == offset) { *p = q; p->tag_idx = j; p->tag_group = 0; /* FIXME: what about groups ??? */ return true; } t += tag_get_len(t); } } while (next_line(&q, 1) && i++ < limit); return false;}void ht_uformat_viewer::focus_cursor(){// why ?/* if (cursor_state==cursor_state_invisible) { center_view(cursor_sub, cursor_id1, cursor_id2); cursor_state=cursor_state_visible; }*/ update_visual_info(); if (cursor_visual_xpos-xscroll <= 1) { if (cursor_visual_xpos>=1) xscroll = cursor_visual_xpos-1; else xscroll = 0; } else if (cursor_visual_xpos+cursor_visual_length-xscroll > size.w-1) { xscroll = cursor_visual_xpos+cursor_visual_length-size.w+1; }}const char *ht_uformat_viewer::func(uint i, bool execute){ switch (i) { case 2: if (caps & VC_EDIT) { if (edit()) { if (execute) app->sendmsg(cmd_file_save);// if (execute) edit_update(); return "save"; } else { return "~save"; } } break;/* case 3: if (caps & VC_REPLACE) { if (edit()) { if (execute) sendmsg(cmd_file_replace); return "replace"; } else { return "~replace"; } } break;*/ case 4: if (caps & VC_EDIT) { if (edit()) { if (execute) { FileOfs start = 0; FileOfs size = file->getSize(); bool isdirty = false; file->cntl(FCNTL_MODS_IS_DIRTY, start, size, &isdirty); char q[1024]; String fn; if (!file->getFilename(fn).isEmpty()) { ht_snprintf(q, sizeof q, "file %y has been modified, apply changes?", &fn); } else { ht_snprintf(q, sizeof q, "untitled file has been modified, apply changes?"); } if (isdirty && confirmbox(q) == button_yes) { file->cntl(FCNTL_MODS_FLUSH); } else { file->cntl(FCNTL_MODS_INVD); } if (size != file->getSize()) { htmsg m; m.msg = msg_filesize_changed; m.type = mt_broadcast; sendmsg(&m); } baseview->sendmsg(cmd_view_mode_i, file, NULL); } return "view"; } else { if (execute) baseview->sendmsg(cmd_edit_mode_i, file, NULL); return "edit"; } } break; case 5: if (caps & VC_GOTO) { if (execute) sendmsg(cmd_file_goto); return "goto"; } break; case 7: if (caps & VC_SEARCH) { if (execute) sendmsg(cmd_file_search); return "search"; } break; case 8: if (caps & VC_RESIZE) { if (edit()) { if (execute) sendmsg(cmd_file_resize); return "resize"; } else { return "~resize"; } } break; case 9: { if (execute) { FileOfs o; if (get_current_real_offset(&o)) { char title[128]; ht_snprintf(title, sizeof title, "view offset %08qx in...", o); ht_view *v = ((ht_app*)app)->popup_view_list(title); if (v) { htmsg m; m.msg = msg_goto_offset; m.type = mt_empty; m.data1.q = o; v->sendmsg(&m); if (m.msg == msg_empty) { vstate_save(); app->focus(v); } else { errorbox("offset %08qx is not supported/invalid in '%s'", o, v->desc); } } } } return "viewin..."; } } return ht_format_viewer::func(i, execute);}vcp ht_uformat_viewer::getcolor_tag(uint pal_index){ return getcolorv(&tagpal, pal_index);}bool ht_uformat_viewer::get_current_offset(FileOfs *offset){ if (cursor_state != cursor_state_disabled && cursor_tag_class == tag_class_edit) { *offset = cursor_tag_offset; return true; } return false;}bool ht_uformat_viewer::get_current_pos(viewer_pos *pos){ clear_viewer_pos(pos); pos->u = cursor; return true;}bool ht_uformat_viewer::get_current_tag(char **tag){ cursorline_get(); char *e = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); if (e) { *tag = e; return true; } return false;}bool ht_uformat_viewer::get_current_tag_size(uint32 *size){ if (cursor_tag_class == tag_class_edit) { cursorline_get(); char *e = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); if (e) { *size = tag_get_size(e); return true; } } return false;}void ht_uformat_viewer::handlemsg(htmsg *msg){ switch (msg->msg) { case msg_get_pindicator: msg->data1.integer = get_pindicator_str((char*)msg->data2.ptr, msg->data1.integer); clearmsg(msg); return; case msg_get_scrollinfo: switch (msg->data1.integer) { case gsi_hscrollbar: { gsi_scrollbar_t *p = (gsi_scrollbar_t*)msg->data2.ptr; if (!get_hscrollbar_pos(&p->pstart, &p->psize)) { p->pstart = 0; p->psize = 100; } clearmsg(msg); return; } case gsi_vscrollbar: { gsi_scrollbar_t *p = (gsi_scrollbar_t*)msg->data2.ptr; if (!get_vscrollbar_pos(&p->pstart, &p->psize)) { p->pstart = 0; p->psize = 100; } clearmsg(msg); return; } } break; case msg_complete_init: complete_init(); clearmsg(msg); return; case msg_keypressed: switch (msg->data1.integer) { case K_Meta_S: if (cursor_select) { select_mode_off(); } else { select_mode_on(); } clearmsg(msg); dirtyview(); return; case K_Up: select_mode_pre(); cursor_up(1); select_mode_post(0); clearmsg(msg); dirtyview(); return; case K_Down: select_mode_pre(); cursor_down(1); select_mode_post(0); clearmsg(msg); dirtyview(); return; case K_PageUp: select_mode_pre(); cursor_up(size.h); select_mode_post(0); clearmsg(msg); dirtyview(); return; case K_PageDown: select_mode_pre(); cursor_down(size.h); select_mode_post(0); clearmsg(msg); dirtyview(); return; case K_Left: if (cursor_state!=cursor_state_disabled) { select_mode_pre(); if (edit()) cursormicro_backward(); else cursor_left(); select_mode_post(0); focus_cursor(); clearmsg(msg); dirtyview(); return; } break; case K_Right: if (cursor_state!=cursor_state_disabled) { int r; select_mode_pre(); if (edit()) r=cursormicro_forward(); else r=cursor_right(); select_mode_post(!r); focus_cursor(); clearmsg(msg); dirtyview(); return; } break; case K_Return: switch (cursor_tag_class) { case tag_class_sel: ref(); break; case tag_class_edit: if (edit()) { edit_input(msg->data1.integer); } break; } dirtyview(); clearmsg(msg); return; case K_Backspace: { FileOfs f; if (edit() && (cursor_tag_class == tag_class_edit) && get_current_offset(&f)) { file->cntl(FCNTL_MODS_CLEAR_DIRTY_RANGE, f, 1); cursor_left(); focus_cursor(); dirtyview(); clearmsg(msg); } return; } case K_Tab: { int c=cursor.tag_group; cursor_tab(); if (cursor.tag_group!=c) { focus_cursor(); update_visual_info(); dirtyview(); clearmsg(msg); return; } break; } case K_Home: if (cursor_state==cursor_state_visible) { select_mode_pre(); cursor_home(); select_mode_post(0); focus_cursor(); clearmsg(msg); dirtyview(); return; } break; case K_End: if (cursor_state==cursor_state_visible) { select_mode_pre(); cursor_end(); select_mode_post(0); focus_cursor(); clearmsg(msg); dirtyview(); return; } break; case K_Control_Left: xscroll-=2; if (xscroll<0) xscroll=0; dirtyview();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -