📄 fv.file.c
字号:
window_set(editsw, WIN_DESIRED_WIDTH, WIN_EXTEND_TO_EDGE, WIN_DESIRED_HEIGHT, WIN_EXTEND_TO_EDGE, WIN_CONSUME_EVENTS, LOC_WINENTER, LOC_WINEXIT, LOC_DRAG, 0, 0);#endif (void)sprintf(buf, "%s/%s", Fv_path[1] == 0 ? "" : Fv_path, name); read_file(editframe, editsw, buf, FALSE); if (pattern) { /* Textedit can be told to do pattern matching; * however textedit can't understand regular * expressions... so ignore any errors. Set * selection. */ if (textsw_find_bytes(editsw, &first, &last_plus_one, pattern, strlen(pattern), 0) != -1) { textsw_normalize_view(editsw, first); textsw_set_selection(editsw, first, last_plus_one, 1); } } } else#endif { if (x != EMPTY) { (void)sprintf(xpos, "%d", x); (void)sprintf(ypos, "%d", y); argv[argc++] = "-Wi"; argv[argc++] = "-WP"; argv[argc++] = xpos; argv[argc++] = ypos; } argv[argc++] = "-WL"; argv[argc++] = name; if (Fv_editor == FV_VI) argv[argc++] = "vi"; argv[argc++] = name; argv[argc] = 0; fv_execit(argv[0], argv); }}#ifdef SV1staticload_file(id) int id;{ register int i; char buf[MAXPATH]; for (i = 0; i< Edit_no; i++) { if (id == Edit_id[i]) { (void)sprintf(buf, "%s/%s", Fv_path[1] == 0 ? "" : Fv_path, Fv_file[fv_getselectedfile()]->name); read_file(Edit_fr[i], Edit_sw[i], buf, TRUE); return(0); } } return(-1);}#endif#ifndef SV1Notify_valueeditsw_event(win, evnt, arg, type) Vu_Window win; Event *evnt; Notify_arg arg; Notify_event_type type;{ char buf[MAXPATH]; if (event_action(evnt) == ACTION_DRAG_LOAD) { Seln_holder holder; Seln_request *sbuf; holder = seln_inquire(SELN_PRIMARY); if (holder.state == SELN_NONE) fv_putmsg(TRUE, "No selection!", 0, 0); else { sbuf = seln_ask(&holder, SELN_REQ_CONTENTS_ASCII, 0, 0); read_file(window_get(win, WIN_FRAME), win, sbuf->data+sizeof(Seln_attribute), TRUE); } } return(notify_next_event_func(win, evnt, arg, type));}#endiffv_quit_frames(){ register int i; for (i = 0; i < Edit_no; i++) if (Edit_fr[i]) window_destroy(Edit_fr[i]); for (i = 0; i < Nfolders; i++) if (Folder_frame[i]) window_destroy(Folder_frame[i]);}static read_file(frame, editsw, name, old) Frame frame; Textsw editsw; char *name; BOOLEAN old;{ Textsw_status tstatus; /* Error code from textsw */ char buf[255]; if (old) if (window_get(editsw, TEXTSW_MODIFIED)) if (!alert_edit(editsw)) return; window_set(editsw, TEXTSW_STATUS, &tstatus, TEXTSW_FILE, name, TEXTSW_FIRST, 0, 0); if (tstatus != TEXTSW_STATUS_OKAY ) { fv_putmsg(TRUE, "Can't read %s: %s", (int)name, (int)sys_errlist[errno]); return; }#ifdef SV1 fv_name_icon(frame, strrchr(name, '/')+1);#else { char *b_p = strrchr(name, '/')+1; /* View2 bug */ vu_set(vu_get(frame, FRAME_ICON), ICON_LABEL, b_p, 0); }#endif (void)strcpy(Last_edited, name); (void)sprintf(buf, "fileview: %s", name); window_set(frame, FRAME_LABEL, buf, WIN_SHOW, TRUE, 0);}staticalert_edit(editsw) Textsw editsw;{ char buf[MAXPATH]; int result; (void)sprintf(buf, "'%s' has been edited, what do you wish to do?", Last_edited); result = alert_prompt(editsw, NULL, ALERT_MESSAGE_STRINGS, buf, 0, ALERT_BUTTON, "Save edits", 1, ALERT_BUTTON, "Discard edits", 2, ALERT_BUTTON, "Cancel", 3, 0); if (result==1) textsw_save(editsw, 0, 0); else if (result==2) textsw_reset(editsw, 0, 0); else return(FALSE); return(TRUE);}static Notify_valuetextsw_recover(frame, status) /* Recover space in Edit array */ Frame frame; Destroy_status status;{ register int i; if (status == DESTROY_CHECKING) { for (i = 0; i < Edit_no; i++) if (Edit_fr[i] == frame) break; while (i<Edit_no) Edit_fr[i] = Edit_fr[i+1], i++; Edit_no--; } return(notify_next_destroy_func(frame, status));}fv_gotofile(name, pattern) /* Open file from FIND list box */ register char *name; /* Filename */ char *pattern; /* String pattern matched in file */{ register int i; /* Index into File array */ register int y; /* Coordinate */ int top; /* Current top of screen */ /* XXX We could probably do a binary search here as long as it was * sorted alphabetically... */ for (i=0; i<Fv_nfiles; i++) if (strcmp(Fv_file[i]->name, name) == 0) break; if (i>=Fv_nfiles || (access(Fv_file[i]->name, F_OK) == -1)) { fv_putmsg(TRUE, Fv_message[MEFIND], (int)name, 0); return; } /* Found the file; scroll it into view... */ y = trans(i); top = GET_SCROLL_VIEW_START; if (y<top || y>(top+(int)window_get(Fv_foldr.canvas, WIN_HEIGHT))) scrollbar_scroll_to(Fv_foldr.vsbar, y>GLYPH_HEIGHT ? y-GLYPH_HEIGHT : 0); fv_file_open(i, FALSE, Fv_file[i]->type == FV_IDOCUMENT ? pattern : NULL, FALSE);}static voidstop_editing(){ int l; /* Length of text */ FV_TNODE *t_p; /* Tree pointer */ char *new_name; /* New name */ FV_FILE *f_p = Fv_file[Renamed_file]; new_name = (char *)panel_get(Text_item, PANEL_VALUE); window_set(Text_panel, WIN_SHOW, FALSE, 0); if (strlen(new_name) && strcmp(f_p->name, new_name)) if (access(new_name, F_OK) == 0) { fv_putmsg(TRUE, Fv_message[MEEXIST], (int)new_name, 0); } else if (rename(f_p->name, new_name) == -1) fv_putmsg(TRUE, Fv_message[MERENAME], (int)sys_errlist[errno], f_p->name); else { char *m_p; /* Change name in tree */ if (f_p->type == FV_IFOLDER) { for (t_p = Fv_current->child; t_p; t_p = t_p->sibling) if (strcmp(t_p->name, f_p->name) == 0) break; if (t_p) { if (strlen(new_name) > strlen(t_p->name)) { m_p = fv_malloc((unsigned)strlen(new_name)+1); free(t_p->name); t_p->name = m_p; } (void)strcpy(t_p->name, new_name); fv_sort_children(t_p->parent); } if (Fv_treeview) fv_drawtree(FALSE); } m_p = fv_malloc((unsigned)strlen(new_name)+1); if (m_p) { free(f_p->name); f_p->name = m_p; (void)strcpy(f_p->name, new_name); Fv_current->mtime = time((time_t *)0); } /* Recalculate string width */ l = fv_strlen(new_name); if (l > Widest_name) Widest_name = l; f_p->width = l; fv_display_folder(FV_STYLE_FOLDER); fv_match_files(new_name); }}/* Select files which match pattern */fv_match_files(pattern) char *pattern;{ register FV_FILE **f_p, **l_p; /* Files array pointers */ register int i; /* Index */ register int y = EMPTY; int top; fv_treedeselect(); /* Turn off old selections */ for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; f_p != l_p; f_p++, i++) if (fv_match((*f_p)->name, pattern) == 1) { if (!(*f_p)->selected) fv_reverse(i); (*f_p)->selected = TRUE; if (y == EMPTY) y = i; } else if ((*f_p)->selected) { /* Turn off old selections */ fv_reverse(i); (*f_p)->selected = FALSE; } if (y != EMPTY) { y = trans(y); top = GET_SCROLL_VIEW_START; if (y<top || y+GLYPH_HEIGHT>(top+ (int)window_get(Fv_foldr.canvas, WIN_HEIGHT))) { /* File is either before or after view window */ if ((i = y-GLYPH_HEIGHT)<0) i = 0;#ifndef SV1 else if (i+window_get(Fv_foldr.canvas, WIN_HEIGHT) > window_get(Fv_foldr.canvas, CANVAS_HEIGHT)) i = window_get(Fv_foldr.canvas, CANVAS_HEIGHT) - window_get(Fv_foldr.canvas, WIN_HEIGHT); i /= Scroll_increment;#endif scrollbar_scroll_to(Fv_foldr.vsbar, i); } } else fv_putmsg(TRUE, Fv_message[MEFIND], (int)pattern, 0);}/* Return currently selected filename */fv_getselectedfile(){ register FV_FILE **f_p, **l_p; /* Files array pointers */ register int i; /* Stop at first selection */ for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; f_p != l_p; f_p++, i++) if ((*f_p)->selected) return(i); return(EMPTY);}fv_select_all(){ register FV_FILE **f_p, **l_p; /* Files array pointers */ register int i; /* Index */ for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; f_p != l_p; f_p++, i++) if (!(*f_p)->selected) { (*f_p)->selected = TRUE; fv_reverse(i); } if (Fv_tselected) { /* Turn off tree selection. Only 1 window * can have selected objects... */ fv_treedeselect(); }}/* Deselect any selected objects */fv_filedeselect(){ register FV_FILE **f_p, **l_p; /* Files array pointers */ register int i; /* Index */ for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; f_p != l_p; f_p++, i++) if ((*f_p)->selected) { (*f_p)->selected = FALSE; fv_reverse(i); }}fv_apply_color(code) int code;{ register FV_FILE **f_p, **l_p; /* Files array pointers */ register int i; /* Index */ register FILE *fp; for (i=0, f_p=Fv_file, l_p=Fv_file+Fv_nfiles; f_p != l_p; f_p++, i++) if ((*f_p)->selected) { (*f_p)->color = (SBYTE)code; pw_rop(Fv_foldr.pw, (*f_p)->x, trans(i), GLYPH_WIDTH, GLYPH_HEIGHT, PIX_SRC | PIX_COLOR((*f_p)->color), (*f_p)->icon>EMPTY && Fv_bind[(*f_p)->icon].icon ? Fv_bind[(*f_p)->icon].icon : Fv_icon[(*f_p)->type], 0, 0); fv_reverse(i); } if (fp = fopen(COLOR_FILE, "w")) { /* Ensure names are sorted alphabetically */ if (Fv_sortby != FV_SORTALPHA) qsort((char *)Fv_file, Fv_nfiles, sizeof(FV_FILE *), Compare_fn[FV_SORTALPHA]); for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles; f_p != l_p; f_p++) if ((*f_p)->color > BLACK) { (void)fputc((*f_p)->color+'0', fp); fputs((*f_p)->name, fp); (void)fputc('\n', fp); } (void)fclose(fp); /* Resort to old sort */ if (Fv_sortby != FV_SORTALPHA && Fv_sortby != FV_NOSORT) qsort((char *)Fv_file, Fv_nfiles, sizeof(FV_FILE *), Compare_fn[Fv_sortby]); } else fv_putmsg(TRUE, Fv_message[MECREAT], (int)COLOR_FILE, 0);}staticstore_colors() /* Store filename,color pair in ..colors */{ static int ncolors = 0; char buf[256]; register FILE *fp; register int i; register unsigned l; /* Free up old color association array */ i = ncolors; while (i) { i--; free(Color_fname[i]); } /* Read in new... */ if ((fp=fopen(COLOR_FILE, "r"))==NULL) return; while (fgets(buf, 255, fp) && ncolors < MAXFILES) { Color_code[i] = buf[0] - '0'; l = (unsigned)strlen(buf); buf[l-1] = NULL; Color_fname[i] = malloc(l); (void)strcpy(Color_fname[i], buf+1); i++; } (void)fclose(fp); Ncolors = ncolors = i;}static int m1[] = { 1, S_IREAD>>0, 'r', '-' };static int m2[] = { 1, S_IWRITE>>0, 'w', '-' };static int m3[] = { 3, S_ISUID|(S_IEXEC>>0), 's', S_IEXEC>>0, 'x', S_ISUID, 'S', '-' };static int m4[] = { 1, S_IREAD>>3, 'r', '-' };static int m5[] = { 1, S_IWRITE>>3, 'w', '-' };static int m6[] = { 3, S_ISGID|(S_IEXEC>>3), 's', S_IEXEC>>3, 'x', S_ISGID, 'S', '-' };static int m7[] = { 1, S_IREAD>>6, 'r', '-' };static int m8[] = { 1, S_IWRITE>>6, 'w', '-' };static int m9[] = { 2, S_ISVTX, 't', S_IEXEC>>6, 'x', '-' };static int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};static char *fmtmode(lp, flags) char *lp; int flags;{ int **mp; for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])]; ) { register int *pairp = *mp++; register int n = *pairp++; while (n-- > 0) { if ((flags&*pairp) == *pairp) { pairp++; break; } else pairp += 2; } *lp++ = *pairp; } return (lp);}staticcheck_bind(f_p) register FV_FILE *f_p;{ register int j; struct stat fstatus; /* File status */ for (j=Fv_nappbind; j<Fv_nbind; j++) if (*Fv_bind[j].pattern) { /* Name regular expression */ if (fv_match(f_p->name, Fv_bind[j].pattern)==1) { f_p->icon = j; break; } } else { /* Magic number */ stat(f_p->name, &fstatus); if (fv_magic(f_p->name, Fv_bind[j].magic, &fstatus)) { f_p->icon = j; break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -