📄 textsw_field.c
字号:
Es_index first, last_plus_one; char buf[MY_BUF_SIZE]; int str_length = MY_BUF_SIZE; int do_search = TRUE; /* * This procedure should only be called if field flag is set to * TEXTSW_FIELD_FORWARD, TEXTSW_FIELD_BACKWARD, * TEXTSW_DELIMITER_FORWARD, TEXTSW_DELIMITER_BACKWARD. */ if (textsw_get_selection(view, &first, &last_plus_one, NULL, 0)) { if ((last_plus_one-first) < MY_BUF_SIZE) str_length = (last_plus_one-first); textsw_get(VIEW_REP_TO_ABS(view), TEXTSW_CONTENTS, first, buf, str_length); if (str_length == MY_BUF_SIZE) str_length--; buf[str_length] = NULL; if (field_flag == TEXTSW_NOT_A_FIELD) { if (str_length > ONE_FIELD_LENGTH) { (void) window_bell(WINDOW_FROM_VIEW(view)); return(FALSE); /* Not a vaild marker size */ } start_marker = buf; do_search = FALSE; } else { do_search = check_selection(buf, str_length, &first, &last_plus_one, start_marker, strlen(start_marker), field_flag); } } else { if (field_flag == TEXTSW_NOT_A_FIELD) { /* Matching must have a selection */ (void) window_bell(WINDOW_FROM_VIEW(view)); return(FALSE); } first = last_plus_one = ev_get_insert(textsw->views); } return (textsw_match_field_and_normalize( view, &first, &last_plus_one, start_marker, strlen(start_marker), field_flag, do_search)); }static voidmy_destroy_proc (frame) Frame frame;{ Textsw_view view = (Textsw_view) window_get(frame, WIN_CLIENT_DATA, 0); Textsw_folio folio = FOLIO_FOR_VIEW(view); window_set(frame, FRAME_NO_CONFIRM, TRUE, 0); window_destroy(frame); match_frame = folio->match_frame = NULL;}static voidselect_text_backward(view, panel) Textsw_view view; Panel panel;{ int value = (int)panel_get( panel_items[(int)CHOICE_ITEM], PANEL_VALUE); switch (value) { case 0 : (void) textsw_match_selection_and_normalize(view, ")", TEXTSW_DELIMITER_BACKWARD); break; case 1 : (void) textsw_match_selection_and_normalize(view, "\"", TEXTSW_DELIMITER_BACKWARD); break; case 2 : (void) textsw_match_selection_and_normalize(view, "'", TEXTSW_DELIMITER_BACKWARD); break; case 3 : (void) textsw_match_selection_and_normalize(view, "`", TEXTSW_DELIMITER_BACKWARD); break; case 4 : (void) textsw_match_selection_and_normalize(view, "}", TEXTSW_DELIMITER_BACKWARD); break; case 5 : (void) textsw_match_selection_and_normalize(view, "]", TEXTSW_DELIMITER_BACKWARD); break; case 6 : (void) textsw_match_selection_and_normalize(view, "<|", TEXTSW_DELIMITER_BACKWARD); break; case 7 : (void) textsw_match_selection_and_normalize(view, "*/", TEXTSW_DELIMITER_BACKWARD); break; } }static voidselect_enclose_text(view, panel) Textsw_view view; Panel panel;{ Textsw_folio folio= FOLIO_FOR_VIEW(view); int value = (int)panel_get( panel_items[(int)CHOICE_ITEM], PANEL_VALUE); int first, last_plus_one; first = last_plus_one = ev_get_insert(folio->views); switch (value) { case 0 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, ")", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 1 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "\"", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 2 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "'", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 3 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "`", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 4 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "}", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 5 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "]", 1, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 6 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "<|", 2, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; case 7 : (void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "*/", 2, TEXTSW_DELIMITER_ENCLOSE, FALSE); break; } }static voidselect_text_forward(view, panel) Textsw_view view; Panel panel;{ int value = (int)panel_get( panel_items[(int)CHOICE_ITEM], PANEL_VALUE); switch (value) { case 0 : (void) textsw_match_selection_and_normalize(view, "(", TEXTSW_DELIMITER_FORWARD); break; case 1 : (void) textsw_match_selection_and_normalize(view, "\"", TEXTSW_DELIMITER_FORWARD); break; case 2 : (void) textsw_match_selection_and_normalize(view, "'", TEXTSW_DELIMITER_FORWARD); break; case 3 : (void) textsw_match_selection_and_normalize(view, "`", TEXTSW_DELIMITER_FORWARD); break; case 4 : (void) textsw_match_selection_and_normalize(view, "{", TEXTSW_DELIMITER_FORWARD); break; case 5 : (void) textsw_match_selection_and_normalize(view, "[", TEXTSW_DELIMITER_FORWARD); break; case 6 : (void) textsw_match_selection_and_normalize(view, "|>", TEXTSW_DELIMITER_FORWARD); break; case 7 : (void) textsw_match_selection_and_normalize(view, "/*", TEXTSW_DELIMITER_FORWARD); break; } } static voidcmd_proc(item, event) Panel_item item; Event *event;{ pkg_private Textsw_view view_from_panel_item(); Textsw_view view = view_from_panel_item(item); Textsw_folio folio = FOLIO_FOR_VIEW(view); Panel panel = panel_get(item, PANEL_PARENT_PANEL, 0); if (item == panel_items[(int)BACKWARD_ITEM]) { select_text_backward(view, panel); } else if (item == panel_items[(int)ENCLOSE_ITEM]) { select_enclose_text(view, panel); } else if (item == panel_items[(int)FORWARD_ITEM]) { select_text_forward(view, panel); } else if (item == panel_items[(int)BLINK_PARENT_ITEM]) { (void) blink_window(VIEW_REP_TO_ABS(view), 3); } else if (item == panel_items[(int)DONE_ITEM]) { (void) my_destroy_proc(folio->match_frame); } }static voidcreate_match_item(panel, view) Panel panel; Textsw_view view;{ char *curly_bracket = " { } "; char *parenthesis = " ( ) "; char *double_quote = " \" \" "; char *single_quote = " ' ' "; char *back_qoute = " ` ` "; char *square_bracket = " [ ] "; char *field_marker = " |> <| "; char *comment = " /* */ "; char *done = "Done"; char *backward = "Backward"; char *enclose = "Expand"; char *forward = "Forward"; char *blink_parent = "Blink Owner"; panel_items[(int)BACKWARD_ITEM] = panel_create_item(panel, PANEL_BUTTON, PANEL_LABEL_X, ATTR_COL(0), PANEL_LABEL_Y, ATTR_ROW(0), PANEL_LABEL_IMAGE, panel_button_image(panel, backward, 8, NULL), PANEL_NOTIFY_PROC, cmd_proc, HELP_DATA, "textsw:fieldbackward", 0); panel_items[(int)ENCLOSE_ITEM] = panel_create_item(panel, PANEL_BUTTON, PANEL_LABEL_IMAGE, panel_button_image(panel, enclose, 8, NULL), PANEL_NOTIFY_PROC, cmd_proc, HELP_DATA, "textsw:fieldforward", 0); panel_items[(int)FORWARD_ITEM] = panel_create_item(panel, PANEL_BUTTON, PANEL_LABEL_IMAGE, panel_button_image(panel, forward, 8, NULL), PANEL_NOTIFY_PROC, cmd_proc, 0); panel_items[(int)BLINK_PARENT_ITEM] = panel_create_item(panel,PANEL_BUTTON, PANEL_LABEL_X, ATTR_COL(58), PANEL_LABEL_Y, ATTR_ROW(0), PANEL_LABEL_IMAGE, panel_button_image(panel, blink_parent, 0, NULL), PANEL_NOTIFY_PROC, cmd_proc, HELP_DATA, "textsw:fieldblink", 0); panel_items[(int)DONE_ITEM] = panel_create_item(panel, PANEL_BUTTON, PANEL_LABEL_Y, ATTR_ROW(0), PANEL_LABEL_IMAGE, panel_button_image(panel, done, 7, NULL), PANEL_NOTIFY_PROC, cmd_proc, HELP_DATA, "textsw:fielddone", 0); panel_items[(int)CHOICE_ITEM] = panel_create_item(panel, PANEL_CHOICE, PANEL_LABEL_X, ATTR_COL(0), PANEL_LABEL_Y, ATTR_ROW(1), PANEL_CHOICE_STRINGS, parenthesis, double_quote, single_quote, back_qoute, curly_bracket, square_bracket, field_marker, comment, 0, HELP_DATA, "textsw:fieldchoice", 0); }extern Paneltextsw_create_match_panel(frame, view) Frame frame; Textsw_view view;{ Panel panel; panel = (Panel)(LINT_CAST(window_create((Window)frame, PANEL, HELP_DATA, "textsw:fieldpanel", 0))); create_match_item(panel, view); return(panel); }static Notify_valuebase_frame_event_proc(base_frame, event, arg, type) Frame base_frame; Event *event; Notify_arg arg; Notify_event_type type;{ Notify_value value = notify_next_event_func(base_frame, event, arg, type); switch (event_action(event)) { case WIN_REPAINT: case TXTSW_OPEN: case MS_RIGHT: if (window_get(base_frame, FRAME_CLOSED)) { if (window_get(match_frame, WIN_SHOW)) window_set(match_frame, WIN_SHOW, FALSE, 0); } else { if (!window_get(match_frame, WIN_SHOW)) window_set(match_frame, WIN_SHOW, TRUE, 0); } break; } return value;} extern voidtextsw_create_match_frame(view) Textsw_view view;{ Textsw_folio folio= FOLIO_FOR_VIEW(view); Frame base_frame = (Frame) window_get(view, WIN_OWNER); Panel panel; char *label = "Find Marked Text"; static int already_interposed; if (!base_frame) { (void)textsw_alert_for_old_interface(view); return; } if (match_frame) { register int match_frame_fd = (int) window_get(match_frame, WIN_FD, 0); register int root_fd; folio->match_frame = match_frame; /* In case the popup is for a different textsw */ window_set(folio->match_frame, WIN_CLIENT_DATA, view, 0); if (win_getlink(match_frame_fd, WL_COVERING) == WIN_NULLLINK) { (void) blink_window(folio->match_frame, 5); } else { root_fd = rootfd_for_toolfd(match_frame_fd); wmgr_top(match_frame_fd, root_fd); (void)close (root_fd); } return; } match_frame = folio->match_frame = window_create(base_frame, FRAME, FRAME_SHOW_LABEL, TRUE, FRAME_DONE_PROC, my_destroy_proc, 0); window_set(folio->match_frame, WIN_CLIENT_DATA, view, 0); panel = textsw_create_match_panel(folio->match_frame, view); if (!already_interposed) notify_interpose_event_func(base_frame, base_frame_event_proc, NOTIFY_SAFE); else already_interposed = TRUE; (void) window_fit(panel); (void) window_fit(folio->match_frame); textsw_set_pop_up_location (base_frame, folio->match_frame); (void) window_set(folio->match_frame, FRAME_LABEL, label, WIN_SHOW, TRUE, 0);}/* * If the pattern is matched, return the index where it is found, * else return -1. */extern inttextsw_match_bytes(abstract, first, last_plus_one, start_sym, start_sym_len, end_sym, end_sym_len, field_flag) Textsw abstract; /* find in this textsw */ Textsw_index *first; /* start here, return start of * found pattern here */ Textsw_index *last_plus_one; /* return end of found pattern */ char *start_sym, *end_sym; /* begin and end pattern */ int start_sym_len, end_sym_len; /* patterns length */ unsigned field_flag;{ Textsw_folio folio = FOLIO_FOR_VIEW(VIEW_ABS_TO_REP(abstract)); int save_first = *first; int save_last_plus_one = *last_plus_one; if ((field_flag == TEXTSW_DELIMITER_FORWARD) || (field_flag == TEXTSW_FIELD_FORWARD)) { (void) textsw_match_field(folio, first, last_plus_one, start_sym, start_sym_len, end_sym, end_sym_len, field_flag, TRUE); } else { (void) textsw_match_field(folio, first, last_plus_one, end_sym, end_sym_len, start_sym, start_sym_len, field_flag, ((field_flag == TEXTSW_DELIMITER_BACKWARD) || (field_flag == TEXTSW_FIELD_BACKWARD))); } if ((*first == ES_CANNOT_SET) || (*last_plus_one == ES_CANNOT_SET)) { *first = save_first; *last_plus_one = save_last_plus_one; return -1; } else { return *first; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -