📄 htapp.cc
字号:
if (f->setAccessMode(old->getAccessMode()) == 0) { FileLayer *l; // FIXME: UGLY hack if (dynamic_cast<ht_ltextfile *>(old)) { l = new ht_ltextfile(f, true, NULL); } else { l = new FileModificator(f, true); } e->layer->setLayered(l, true); e->isfile = true; delete old; char *fullfn; if (sys_canonicalize(&fullfn, fn)==0) { e->window->settitle(fullfn); free(fullfn); } else { e->window->settitle(fn); } clearmsg(msg); } else { String s1, s2; errorbox("couldn't inherit access_mode from '%y' to '%y'", &old->getDesc(s1), &f->getDesc(s2)); } } } } return; } case msg_kill: { htmsg m; ht_window *w = (ht_window*)msg->data1.ptr; m.msg = msg_accept_close; m.type = mt_broadcast; m.data1.ptr = NULL; m.data2.ptr = NULL; w->sendmsg(&m); if (m.msg == msg_accept_close) delete_window(w); clearmsg(msg); return; } } if (msg->msg == msg_draw) { start_timer(h0); if (msg->type == mt_broadcast) { ht_view *v = first; while (v) { v->handlemsg(msg); v = v->next; } } else { current->handlemsg(msg); } stop_timer(h0); draw(); screen->show(); } else { ht_group::handlemsg(msg); } switch (msg->msg) { case msg_keypressed: { int i=0; switch (msg->data1.integer) { case K_Meta_9: i++; case K_Meta_8: i++; case K_Meta_7: i++; case K_Meta_6: i++; case K_Meta_5: i++; case K_Meta_4: i++; case K_Meta_3: i++; case K_Meta_2: i++; case K_Meta_1: i++; focus(get_window_by_number(i)); clearmsg(msg); return; case K_F12: i++; case K_F11: i++; case K_F10: i++; case K_F9: i++; case K_F8: i++; case K_F7: i++; case K_F6: i++; case K_F5: i++; case K_F4: i++; case K_F3: i++; case K_F2: i++; case K_F1: i++; htmsg m; m.msg=msg_funcquery; m.type=mt_empty; m.data1.integer=i; sendmsg(&m); if (m.msg==msg_retval) { sendmsg(msg_funcexec, i); clearmsg(msg); return; } break;/* case K_Meta_R: { const char *n = "ht.reg"; LocalFile f(n, IOAM_WRITE, FOM_CREATE); CompressedStream c(&f, false);// StreamLayer c(&f, false); ObjectStreamBin b(&c, false); b.putObject(registry, NULL); infobox("registry dumped to '%s'", n); clearmsg(msg); return; }*/#if 0 /* FIXME: experimental */ case K_Control_F9: ((ht_app*)app)->create_window_term("main.exe"); clearmsg(msg); return; case K_Meta_T: create_window_ofm("reg:/", "local:/"); clearmsg(msg); return;*/ case K_Control_A: create_window_help("/HT/res/info/intidx.info", "Top");// create_window_help("c:/djgpp/projects/enew/res/info/ibnidx.info", "Interrupts By Number"); dirtyview(); clearmsg(msg); return;#endif case K_Space: sendmsg(cmd_popup_dialog_view_list); clearmsg(msg); return; } break; } case cmd_about: msgbox(btmask_ok, "About "ht_name, 0, align_custom, "\n" "\ec"ht_name" "ht_version" (%s)\n\n" "\el"ht_copyright1"\n"ht_copyright2"\n\n" "This program is GPL'd. See Help for more information.", sys_get_name()); break; case msg_funcexec: if (func(msg->data1.integer, 1)) { clearmsg(msg); return; } break; case msg_funcquery: { const char *s = func(msg->data1.integer, 0); if (s) { msg->msg = msg_retval; msg->data1.cstr = s; } else clearmsg(msg); return; } case cmd_file_exec_cmd: { char cmd[HT_NAME_MAX]; cmd[0] = 0; if (inputbox("execute shell command (experimental!)", (sys_get_caps() & SYSCAP_NBIPC) ? "command" : "non-interactive (!) command", cmd, sizeof cmd, HISTATOM_FILE) == button_ok) { if (cmd[0]) create_window_term(cmd); } clearmsg(msg); return; } case cmd_file_extend: { File *f = (File *)msg->data1.ptr; FileOfs s = msg->data2.q; // don't ask. only for truncates// if (confirmbox("really extend %s to offset %08qx/%qd?", f->get_filename(), s, s) == button_ok) { IOAccessMode oam = f->getAccessMode(); if (!(oam & IOAM_WRITE)) f->setAccessMode(oam | IOAM_WRITE); try { f->extend(s); } catch (const IOException &e) { errorbox("couldn't extend file to offset 0x%08qx/%qd: %y", s, s, &e); } if (!(oam & IOAM_WRITE)) f->setAccessMode(oam);// } clearmsg(msg); return; } case cmd_file_truncate: { File *f = (File *)msg->data1.ptr; FileOfs s = msg->data2.q;/* ht_app_window_entry *e; if ((e = windows->enum_first())) { do { if (e->type == AWT_FILE && (File*)e->data == f) { check_collide(); } } while ((e = windows->enum_next())); }*/ String fn; if (confirmbox("really truncate %y at offset 0x%08qx/%qd?", &f->getFilename(fn), s, s) == button_ok) { f->truncate(s); } clearmsg(msg); return; } case cmd_quit: if (accept_close_all_windows()) { LOG("terminating..."); exit_program = true; sendmsg(cmd_project_close); clearmsg(msg); } return; case cmd_file_open: { char *name; uint mode; if (file_open_dialog(&name, &mode)) { if (name[0]) create_window_file(name, mode, true); free(name); } clearmsg(msg); return; } case cmd_file_new: { Bounds b; get_stdbounds_file(&b); uint mode; if (file_new_dialog(&mode)) { MemoryFile *mfile = new MemoryFile(); switch (mode) { case FOM_TEXT: { ht_syntax_lexer *lexer = NULL; ht_ltextfile *tfile = new ht_ltextfile(mfile, true, lexer); ht_layer_textfile *file = new ht_layer_textfile(tfile, true); create_window_file_text(&b, file, "Untitled", false/* because mem_file is underlying, not ht_file, etc.*/); break; } case FOM_BIN: { FileModificator *modfile = new FileModificator(mfile, true); FileLayer *file = new FileLayer(modfile, true); ht_window *w = create_window_file_bin(&b, file, "Untitled", false); htmsg m; m.msg = cmd_file_resize; m.type = mt_empty; w->sendmsg(&m); } } } clearmsg(msg); return; } case cmd_edit_show_clipboard: { create_window_clipboard(); clearmsg(msg); return; } case cmd_edit_clear_clipboard: { if (confirmbox("Do you really want to delete the clipboard?")==button_ok) { clipboard_clear(); } clearmsg(msg); return; } case cmd_edit_paste_into_file: { char filename[HT_NAME_MAX]; filename[0] = 0; if (file_chooser("clipboard - paste into file", filename, sizeof filename)) { try { String fn(filename); LocalFile f(fn, IOAM_WRITE, FOM_CREATE); clipboard_paste(&f, 0); } catch (const IOException &e) { errorbox("error writing: '%s': '%y'", filename, &e); } } clearmsg(msg); return; } case cmd_edit_copy_from_file: { char filename[HT_NAME_MAX]; filename[0] = 0; if (file_chooser("clipboard - copy from file", filename, sizeof filename)) { char desc[HT_NAME_MAX+5]; try { String fn(filename); LocalFile f(fn, IOAM_READ, FOM_EXISTS); ht_snprintf(desc, sizeof desc, "file %s", filename); clipboard_copy(desc, &f, 0, f.getSize()); } catch (const IOException &e) { errorbox("error reading: '%s': '%y'", filename, &e); } } clearmsg(msg); return; } case cmd_project_open: { char fn[HT_NAME_MAX]; fn[0] = 0; if (file_chooser("Open project", fn, sizeof fn)) { sendmsg(cmd_project_close); project_opencreate(fn); } clearmsg(msg); return; } case cmd_project_close: { if (project) { const char *fn = ((ht_project*)project)->get_filename(); LOG("%s: saving project", fn); do { String err; if (save_fileconfig(fn, ht_projectconfig_magic, ht_projectconfig_fileversion, file_project_store_fcfg_func, NULL, err) != LS_OK) { String e; e.assignFormat("Couldn't save '%y': %y\n\nRetry?", &fn, &err); switch (msgbox(btmask_yes+btmask_no+btmask_cancel, "confirmation", 0, align_center, e.contentChar())) { case button_ok: continue; case button_cancel: return; } LOG("%s: failed", fn); } else { LOG("%s: done", fn); } break; } while (1); delete ((ht_project*)project); project = NULL; htmsg m; m.type = mt_broadcast; m.msg = msg_project_changed; sendmsg(&m); } clearmsg(msg); return; } case cmd_window_close: if (battlefield->current) sendmsg(msg_kill, battlefield->current); clearmsg(msg); return; case cmd_window_tile_vertical: tile(true); clearmsg(msg); return; case cmd_window_tile_horizontal: tile(false); clearmsg(msg); return; case cmd_popup_dialog_eval: { eval_dialog(NULL, NULL, NULL); clearmsg(msg); return; } case cmd_popup_dialog_view_list: { ht_view *v = popup_view_list("select mode"); if (v) focus(v); clearmsg(msg); return; } case cmd_popup_dialog_window_list: { ht_window *w = popup_window_list("select window"); if (w) focus(w); clearmsg(msg); return; } case cmd_popup_dialog_info_loader: { char file[256]; file[0] = 0; if (inputbox("open info file", "filename", file, sizeof file, HISTATOM_FILE) == button_ok) { char node[256]; strcpy(node, "Top"); if (inputbox("open info file", "nodename", node, sizeof node, HISTATOM_GOTO) == button_ok) { create_window_help(file, node); dirtyview(); } } clearmsg(msg); return; } case cmd_popup_window_log: create_window_log(); clearmsg(msg); return; case cmd_popup_window_project: create_window_project(); clearmsg(msg); return; case cmd_popup_window_options: create_window_ofm("reg:/", NULL); clearmsg(msg); return; case cmd_popup_window_help: create_window_help(MAGIC_HT_HELP, "Top"); clearmsg(msg); return; case msg_project_changed: { ht_window *w = ((ht_app*)app)->get_window_by_type(AWT_PROJECT); if (w) w->sendmsg(msg_dirtyview); app->sendmsg(msg_draw); return; } }}void ht_app::insert_window(ht_window *window, uint type, bool minimized, bool isfile, FileLayer *layer){ uint n=find_free_window_number(); ht_app_window_entry *e=new ht_app_window_entry(window, n, type, minimized, isfile, layer); windows->insert(e); window->setnumber(n); battlefield->insert(window); focus(window);}void ht_app::load(ObjectStream &f){ ht_registry *tmp = registry; GET_OBJECT(f, registry); if (tmp) { tmp->done(); delete tmp; } load_history(f); htmsg m; m.msg = msg_config_changed; m.type = mt_broadcast; app->sendmsg(&m);}ObjectID ht_app::getObjectID() const{ return ATOM_HT_APP;}static int my_compare_func(const char *a, const char *b){ return strcmp(a, b);}ht_view *ht_app::popup_view_list(const char *dialog_title){ if (!battlefield->current) return NULL; Bounds b, c; getbounds(&b); b.x=b.w/4; b.y=b.h/4; b.w/=2; b.h/=2; ht_dialog *dialog=new ht_dialog(); dialog->init(&b, dialog_title, FS_KILLER | FS_TITLE | FS_MOVE); /* create listbox */ c=b; c.x=0; c.y=0; c.w-=2; c.h-=2; ht_text_listbox *listbox=new ht_text_listbox(); listbox->init(&c, 1, 0, LISTBOX_NORMAL); /* insert all browsable views */ Array structure(false); int index=0;/* int count=*/popup_view_list_dump(battlefield->current, listbox, &structure, 0, &index, battlefield->getselected());/* and seek to the currently selected one */ listbox->update(); listbox->gotoItemByPosition(index); ht_text_listbox_sort_order so[1]; so[0].col = 0; so[0].compare_func = my_compare_func;/* so[1].col = 1; so[1].compare_func = my_compare_func;*/ // listbox->sort(1, so); dialog->insert(listbox); dialog->setpalette(palkey_generic_special); ht_view *result = NULL; if (dialog->run(false)) { ht_listbox_data data; ViewDataBuf vdb(listbox, &data, sizeof data); result = (ht_view*)structure[listbox->getID(data.data->cursor_ptr)]; } dialog->done(); delete dialog; return result;}int ht_app::popup_view_list_dump(ht_view *view, ht_text_listbox *listbox, List *structure, int depth, int *currenti, ht_view *currentv){ if (!view) return 0; char str[256]; /* secure */ char *s=str; if (!(view->options & VO_BROWSABLE)) { depth--; } for (int i=0; i<depth; i++) { *(s++)=' ';*(s++)=' '; } *s=0; int c=view->childcount(); int count=0; for (int i=0; i<c; i++) { ht_view *v = view->getfirstchild(); while (v) { if (v->browse_idx == i) break; v = v->next; } if (!v) return count; // FIXME: "viewergroup": dirty hack !!! if (v->desc && (strcmp(v->desc, VIEWERGROUP_NAME)) && (v->options & VO_BROWSABLE)) { ht_snprintf(s, sizeof str-(s-str), "- %s", v->desc); structure->insert(v); if (v==currentv) *currenti=structure->count()-1; listbox->insert_str(structure->count()-1, str); count++; } count += popup_view_list_dump(v, listbox, structure, depth+1, currenti, currentv); } return count;}ht_window *ht_app::popup_window_list(const char *dialog_title){ Bounds b, c; getbounds(&b); c=b; b.w=b.w*2/3; b.h=b.h*2/3; b.x=(c.w-b.w)/2; b.y=(c.h-b.h)/2; ht_dialog *dialog=new ht_dialog(); dialog->init(&b, dialog_title, FS_KILLER | FS_TITLE | FS_MOVE); /* create listbox */ c=b; c.x=0; c.y=0; c.w-=2; c.h-=2; ht_text_listbox *listbox=new ht_itext_listbox(); listbox->init(&c, 2, 1); foreach(ht_app_window_entry, e, *windows, { char l[16]; /* secure */ ht_snprintf(l, sizeof l, " %2d", e->number); listbox->insert_str(e->number, l, e->window->desc); }); listbox->update(); if (battlefield->current) listbox->gotoItemByPosition(battlefield->current->getnumber()-1); dialog->insert(listbox); dialog->setpalette(palkey_generic_special); ht_window *result = NULL; if (dialog->run(false)) { ht_listbox_data data; ViewDataBuf vdb(listbox, &data, sizeof data); result = get_window_by_number(listbox->getID(data.data->cursor_ptr)); } dialog->done(); delete dialog; return result;}void ht_app::project_opencreate(const char *filename){ char fn[HT_NAME_MAX]; char cwd[HT_NAME_MAX]; getcwd(cwd, sizeof cwd); if (sys_common_canonicalize(fn, filename, cwd, sys_is_path_delim) != 0) { LOG("%s: invalid filename", filename); return; } char *suf = sys_filename_suffix(fn); /* append HT project file suffix if not already there */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -