📄 htapp.cc
字号:
errorbox_modal("%s: error (%04x) changing attribute", name, errno & 0xffff); } else { return SERR_RETRY; } } } } break;#endif } default: errorbox_modal("%s: stream error %04x: %s", name, err, strerror(err)); } } else { err=err&0xffff; errorbox_modal("%s: internal stream error %04x", name, err); } return SERR_FAIL;}#endif/* * app_out_of_memory_proc() */void *app_memory_reserve = NULL;int app_out_of_memory_proc(int size){ if (app_memory_reserve) { free(app_memory_reserve); app_memory_reserve = 0; warnbox_modal("the memory is getting low..."); return OUT_OF_MEMORY_RETRY; } else { return OUT_OF_MEMORY_FAIL; }}/* * CLASS ht_project */ht_project::ht_project(const char *fn) : AVLTree(true){ filename = ht_strdup(fn);}ht_project::~ht_project(){ free(filename);}const char *ht_project::get_filename(){ return filename;}void ht_project::load(ObjectStream &s){ // FIXME: probably not The Right Thing String fn; filename = ht_strdup(s.getDesc(fn).contentChar()); AVLTree::load(s);}ObjectID ht_project::getObjectID() const{ return ATOM_HT_PROJECT;}void ht_project::store(ObjectStream &s) const{ AVLTree::store(s);}/* * CLASS ht_project_item */ht_project_item::ht_project_item(const char *f, const char *p){ filename = ht_strdup(f); path = ht_strdup(p);}ht_project_item::~ht_project_item(){ free(filename); free(path);}const char *ht_project_item::get_filename() const{ return filename;}const char *ht_project_item::get_path() const{ return path;}int ht_project_item::compareTo(const Object *obj) const{ ht_project_item *b = (ht_project_item *)obj; int c = sys_filename_cmp(get_path(), b->get_path()); return (c == 0) ? sys_filename_cmp(get_filename(), b->get_filename()) : c;}void ht_project_item::load(ObjectStream &s){ GET_STRING(s, path); GET_STRING(s, filename);}ObjectID ht_project_item::getObjectID() const{ return ATOM_HT_PROJECT_ITEM;}void ht_project_item::store(ObjectStream &s) const{ PUT_STRING(s, path); PUT_STRING(s, filename);}/* * CLASS ht_project_list */void ht_project_listbox::init(Bounds *b, ht_project *p){ project = p; ht_listbox::init(b); colwidths[0] = 16; colwidths[1] = 16;}int ht_project_listbox::calcCount(){ return project ? project->count() : 0;}void ht_project_listbox::draw(){ if (project) { ht_listbox::draw(); } else { vcp fc = focused ? getcolor(palidx_generic_list_focused_unselected) : getcolor(palidx_generic_list_unfocused_unselected); clear(fc); buf->print(0, 0, fc, "<no project>"); }}const char *ht_project_listbox::func(uint i, bool execute){ return NULL;}void *ht_project_listbox::getFirst(){ if (project && project->count()) { return (void*)1; } else { return NULL; }}void *ht_project_listbox::getLast(){ if (project && project->count()) { return (void*)(project->count()); } else { return NULL; }}void *ht_project_listbox::getNext(void *entry){ unsigned long e=(unsigned long)entry; if (!e) return NULL; if (project && (e < project->count())) { return (void*)(e+1); } else { return NULL; }}void *ht_project_listbox::getPrev(void *entry){ unsigned long e=(unsigned long)entry; if (e > 1) { return (void*)(e-1); } else { return NULL; }}const char *ht_project_listbox::getStr(int col, void *entry){ static char mybuf[32]; if (project) switch (col) { case 0: ht_snprintf(mybuf, sizeof mybuf, "%s", ((ht_project_item*)(*project)[(long)entry-1])->get_filename()); break; case 1: ht_snprintf(mybuf, sizeof mybuf, "%s", ((ht_project_item*)(*project)[(long)entry-1])->get_path()); break; default: strcpy(mybuf, "?"); } else { strcpy(mybuf, "<no project>"); } return mybuf;}void ht_project_listbox::handlemsg(htmsg *msg){ switch (msg->msg) { case cmd_project_add_item: { if (project) { char fn[FILENAME_MAX]; if (file_chooser("Add project item", fn, sizeof fn)) { char ffn[HT_NAME_MAX]; char *dir; if (sys_common_canonicalize(ffn, fn, NULL, sys_is_path_delim) == 0 && sys_basename(fn, ffn) == 0 && (dir = sys_dirname(ffn)) ) { ht_project_item *p = new ht_project_item(fn, dir); ((ht_project*)project)->insert(p); app->sendmsg(msg_project_changed); free(dir); } } } clearmsg(msg); return; } case cmd_project_remove_item: { int p = pos; ht_project_item *pi = (ht_project_item*)(*project)[p]; if (calcCount() && confirmbox("Really remove item '%s'?", pi->get_filename()) == button_ok) { cursorUp(1); project->delObj(pi); update(); if (p) cursorDown(1); dirtyview(); rearrangeColumns(); } clearmsg(msg); return; } case msg_keypressed: { switch (msg->data1.integer) { case K_Return: { if (calcCount() && selectEntry(e_cursor)) { clearmsg(msg); return; } } } break; } } ht_listbox::handlemsg(msg);}int ht_project_listbox::numColumns(){ return 2;}void *ht_project_listbox::quickfind(const char *s){ void *item = getFirst(); int slen = strlen(s); while (item && (ht_strncmp(getStr(0, item), s, slen)!=0)) { item = getNext(item); } return item;}char *ht_project_listbox::quickfindCompletition(const char *s){ void *item = getFirst(); char *res = NULL; int slen = strlen(s); while (item) { if (ht_strncmp(getStr(0, item), s, slen)==0) { if (!res) { res = ht_strdup(getStr(0, item)); } else { int a = ht_strccomm(res, getStr(0, item)); res[a] = 0; } } item = getNext(item); } return res;}bool ht_project_listbox::selectEntry(void *entry){ int p = pos; ht_project_item *i = (ht_project_item *)(*project)[p]; char fn[HT_NAME_MAX]; if (sys_common_canonicalize(fn, i->get_filename(), i->get_path(), sys_is_path_delim)==0) { ((ht_app*)app)->create_window_file(fn, FOM_AUTO, false); } return true;}void ht_project_listbox::set_project(ht_project *p){ project = p; update();}/* * CLASS ht_project_window */void ht_project_window::init(Bounds *b, const char *desc, uint framestyle, uint number, ht_project **p){ ht_window::init(b, desc, framestyle, number); project = p; Bounds c = *b; c.x = 0; c.y = 0; c.w -= 2; c.h -= 2; plb = new ht_project_listbox(); plb->init(&c, *p); insert(plb); sendmsg(msg_project_changed);}void ht_project_window::done(){ ht_window::done();}void ht_project_window::handlemsg(htmsg *msg){ switch (msg->msg) { case msg_project_changed: { const char *t = *project ? (*project)->get_filename() : NULL; if (t) { ht_snprintf(wtitle, sizeof wtitle, "project '%s'", t); } else { strcpy(wtitle, "project window"); } settitle(wtitle); plb->set_project(*project); break; } case msg_contextmenuquery: { ht_static_context_menu *projects = new ht_static_context_menu(); projects->init("~Project"); projects->insert_entry("~Add item", "Insert", cmd_project_add_item, K_Insert, 1); projects->insert_entry("~Remove item", "Delete", cmd_project_remove_item, K_Delete, 1);// projects->insert_entry("~Edit item", NULL, cmd_project_edit_item, 0, 1); msg->msg = msg_retval; msg->data1.ptr = projects; return; } } ht_window::handlemsg(msg);}/* * CLASS ht_status */void ht_status::init(Bounds *b){ ht_view::init(b, VO_TRANSPARENT_CHARS | VO_RESIZE, 0); VIEW_DEBUG_NAME("ht_status"); growmode = MK_GM(GMH_FIT, GMV_TOP); idle_count = 0; analy_ani = 0; clear_len = 0; format = get_config_string("misc/statusline"); if (!format) { format = strdup(STATUS_DEFAULT_FORMAT); } render(); register_idle_object(this);}void ht_status::done(){ unregister_idle_object(this); free(format); ht_view::done();}const char *ht_status::defaultpalette(){ return palkey_generic_menu_default;}void ht_status::draw(){ fill(size.w-clear_len, 0, clear_len, 1, getcolor(palidx_generic_text_focused), ' '); int len = strlen(workbuf); clear_len = len; buf->print(size.w-len, 0, getcolor(palidx_generic_text_focused), workbuf);}void ht_status::handlemsg(htmsg *msg){ switch (msg->msg) { case msg_config_changed: free(format); format = get_config_string("misc/statusline"); break; } ht_view::handlemsg(msg);}void ht_status::getminbounds(int *width, int *height){ *width = 1; *height = 1;}bool ht_status::idle(){ if (idle_count % 100 == 0) { char *oldstatus = ht_strdup(workbuf); render(); if (strcmp(oldstatus, workbuf)) { dirtyview(); redraw(); screen->show(); } free(oldstatus); analy_ani++; analy_ani &= 7; } idle_count++; return false;}void ht_status::render(){ char *f = format; char *buf = workbuf; if (f) while (*f) { if (*f == STATUS_ESCAPE) { switch (*(++f)) { case STATUS_ESCAPE: *(buf++) = STATUS_ESCAPE; break; case STATUS_ANALY_ACTIVE: if (some_analyser_active) { const char *analysers[] = {"Analy", "aNaly", "anAly", "anaLy", "analY", "anaLy", "anAly", "aNaly"}; strcpy(buf, analysers[analy_ani]); buf += 5; } break; case STATUS_ANALY_LINES: if (some_analyser_active) { buf += sprintf(buf, "(%d)", num_ops_parsed); } break; case STATUS_TIME: { time_t Time; time(&Time); tm *t = localtime(&Time); buf += sprintf(buf, "%02d:%02d", t->tm_hour, t->tm_min); break; } case STATUS_DATE: { time_t Time; time(&Time); tm *t = localtime(&Time); buf += sprintf(buf, "%02d.%02d.%04d", t->tm_mday, t->tm_mon+1, t->tm_year+1900); break; } } } else { *(buf++) = *f; } f++; } *buf = 0;}/* * CLASS ht_keyline */void ht_keyline::init(Bounds *b){ ht_view::init(b, VO_RESIZE, 0); VIEW_DEBUG_NAME("ht_keyline"); growmode = MK_GM(GMH_FIT, GMV_BOTTOM);}void ht_keyline::done(){ ht_view::done();}const char *ht_keyline::defaultpalette(){ return palkey_generic_keys_default;}void ht_keyline::draw(){ clear(getcolor(palidx_generic_text_disabled)); int x = 0; for (int i = 1; i <= 10; i++) { htmsg msg; msg.type = mt_empty; msg.msg = msg_funcquery; msg.data1.integer = i; baseview->sendmsg(&msg); buf->printChar(x, 0, getcolor(palidx_generic_text_shortcut), '0'+i%10); if (msg.msg == msg_retval) { char *s = msg.data1.str; if (s) { if (s[0]=='~') { buf->print(x+1, 0, getcolor(palidx_generic_text_disabled), s+1); } else { for (int j=0; j<size.w/10-1; j++) { buf->print(x+j+1, 0, getcolor(palidx_generic_text_focused), " "); } buf->print(x+1, 0, getcolor(palidx_generic_text_focused), s); } } } x += size.w / 10; }}void ht_keyline::getminbounds(int *width, int *height){ *width = 1; *height = 1;}/* * CLASS ht_desktop */void ht_desktop::init(Bounds *b){ ht_view::init(b, VO_OWNBUFFER | VO_RESIZE, 0); VIEW_DEBUG_NAME("ht_desktop"); growmode = MK_GM(GMV_FIT, GMH_FIT);}const char *ht_desktop::defaultpalette(){ return palkey_generic_desktop_default;}void ht_desktop::draw(){ fill(0, 0, size.w, size.h, getcolor(palidx_generic_body), GC_MEDIUM, CP_GRAPHICAL);}/* * CLASS ht_log_msg */ ht_log_msg::ht_log_msg(vcp Color, char *Msg){ color = Color; msg = ht_strdup(Msg);}ht_log_msg::~ht_log_msg(){ free(msg);}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -