edit.c
来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C语言 代码 · 共 2,280 行 · 第 1/5 页
C
2,280 行
edit->force |= REDRAW_LINE;
if (edit->found_len)
/* the next key press will unhighlight the found string, so update whole page */
edit->force |= REDRAW_PAGE;
if (command / 100 == 6) { /* a highlight command like shift-arrow */
if (!edit->highlight || (edit->mark2 != -1 && edit->mark1 != edit->mark2)) {
edit_mark_cmd (edit, 1); /* clear */
edit_mark_cmd (edit, 0); /* marking on */
}
edit->highlight = 1;
} else { /* any other command */
if (edit->highlight)
edit_mark_cmd (edit, 0); /* clear */
edit->highlight = 0;
}
/* first check for undo */
if (command == CK_Undo) {
edit_do_undo (edit);
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
return 1;
}
/* An ordinary key press */
if (char_for_insertion >= 0) {
if (edit->overwrite) {
if (edit_get_byte (edit, edit->curs1) != '\n')
edit_delete (edit);
}
edit_insert (edit, char_for_insertion);
if (option_auto_para_formatting) {
format_paragraph (edit, 0);
edit->force |= REDRAW_PAGE;
} else
check_and_wrap_line (edit);
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
edit_find_bracket (edit);
return 1;
}
switch (command) {
case CK_Begin_Page:
case CK_End_Page:
case CK_Begin_Page_Highlight:
case CK_End_Page_Highlight:
case CK_Word_Left:
case CK_Word_Right:
case CK_Up:
case CK_Down:
case CK_Word_Left_Highlight:
case CK_Word_Right_Highlight:
case CK_Up_Highlight:
case CK_Down_Highlight:
if (edit->mark2 == -1)
break; /*marking is following the cursor: may need to highlight a whole line */
case CK_Left:
case CK_Right:
case CK_Left_Highlight:
case CK_Right_Highlight:
edit->force |= REDRAW_CHAR_ONLY;
}
/* basic cursor key commands */
switch (command) {
case CK_BackSpace:
if (option_backspace_through_tabs && is_in_indent (edit)) {
while (edit_get_byte (edit, edit->curs1 - 1) != '\n'
&& edit->curs1 > 0)
edit_backspace (edit);
break;
} else {
if (option_fake_half_tabs) {
int i;
if (is_in_indent (edit) && right_of_four_spaces (edit)) {
for (i = 0; i < HALF_TAB_SIZE; i++)
edit_backspace (edit);
break;
}
}
}
edit_backspace (edit);
break;
case CK_Delete:
if (option_fake_half_tabs) {
int i;
if (is_in_indent (edit) && left_of_four_spaces (edit)) {
for (i = 1; i <= HALF_TAB_SIZE; i++)
edit_delete (edit);
break;
}
}
edit_delete (edit);
break;
case CK_Delete_Word_Left:
edit_left_delete_word (edit);
break;
case CK_Delete_Word_Right:
edit_right_delete_word (edit);
break;
case CK_Delete_Line:
edit_delete_line (edit);
break;
case CK_Delete_To_Line_End:
edit_delete_to_line_end (edit);
break;
case CK_Delete_To_Line_Begin:
edit_delete_to_line_begin (edit);
break;
case CK_Enter:
if (option_auto_para_formatting) {
edit_double_newline (edit);
if (option_return_does_auto_indent)
edit_auto_indent (edit, 0);
format_paragraph (edit, 0);
} else if (option_return_does_auto_indent) {
edit_insert (edit, '\n');
edit_auto_indent (edit, 0);
} else {
edit_insert (edit, '\n');
}
break;
case CK_Return:
edit_insert (edit, '\n');
break;
case CK_Page_Up:
case CK_Page_Up_Highlight:
edit_move_up (edit, edit->num_widget_lines - 1, 1);
break;
case CK_Page_Down:
case CK_Page_Down_Highlight:
edit_move_down (edit, edit->num_widget_lines - 1, 1);
break;
case CK_Left:
case CK_Left_Highlight:
if (option_fake_half_tabs) {
if (is_in_indent (edit) && right_of_four_spaces (edit)) {
edit_cursor_move (edit, -HALF_TAB_SIZE);
edit->force &= (0xFFF - REDRAW_CHAR_ONLY);
break;
}
}
edit_cursor_move (edit, -1);
break;
case CK_Right:
case CK_Right_Highlight:
if (option_fake_half_tabs) {
if (is_in_indent (edit) && left_of_four_spaces (edit)) {
edit_cursor_move (edit, HALF_TAB_SIZE);
edit->force &= (0xFFF - REDRAW_CHAR_ONLY);
break;
}
}
edit_cursor_move (edit, 1);
break;
case CK_Begin_Page:
case CK_Begin_Page_Highlight:
edit_begin_page (edit);
break;
case CK_End_Page:
case CK_End_Page_Highlight:
edit_end_page (edit);
break;
case CK_Word_Left:
case CK_Word_Left_Highlight:
edit_left_word_move_cmd (edit);
break;
case CK_Word_Right:
case CK_Word_Right_Highlight:
edit_right_word_move_cmd (edit);
break;
case CK_Up:
case CK_Up_Highlight:
edit_move_up (edit, 1, 0);
break;
case CK_Down:
case CK_Down_Highlight:
edit_move_down (edit, 1, 0);
break;
case CK_Paragraph_Up:
case CK_Paragraph_Up_Highlight:
edit_move_up_paragraph (edit, 0);
break;
case CK_Paragraph_Down:
case CK_Paragraph_Down_Highlight:
edit_move_down_paragraph (edit, 0);
break;
case CK_Scroll_Up:
case CK_Scroll_Up_Highlight:
edit_move_up (edit, 1, 1);
break;
case CK_Scroll_Down:
case CK_Scroll_Down_Highlight:
edit_move_down (edit, 1, 1);
break;
case CK_Home:
case CK_Home_Highlight:
edit_cursor_to_bol (edit);
break;
case CK_End:
case CK_End_Highlight:
edit_cursor_to_eol (edit);
break;
case CK_Tab:
edit_tab_cmd (edit);
if (option_auto_para_formatting) {
format_paragraph (edit, 0);
edit->force |= REDRAW_PAGE;
} else
check_and_wrap_line (edit);
break;
case CK_Toggle_Insert:
edit->overwrite = (edit->overwrite == 0);
#ifndef MIDNIGHT
CSetCursorColor (edit->overwrite ? color_palette (24) : color_palette (19));
#endif
break;
case CK_Mark:
edit_mark_cmd (edit, 0);
break;
case CK_Unmark:
edit_mark_cmd (edit, 1);
break;
case CK_Beginning_Of_Text:
case CK_Beginning_Of_Text_Highlight:
edit_move_to_top (edit);
break;
case CK_End_Of_Text:
case CK_End_Of_Text_Highlight:
edit_move_to_bottom (edit);
break;
case CK_Copy:
edit_block_copy_cmd (edit);
break;
case CK_Remove:
edit_block_delete_cmd (edit);
break;
case CK_Move:
edit_block_move_cmd (edit);
break;
case CK_XStore:
edit_copy_to_X_buf_cmd (edit);
break;
case CK_XCut:
edit_cut_to_X_buf_cmd (edit);
break;
case CK_XPaste:
edit_paste_from_X_buf_cmd (edit);
break;
case CK_Selection_History:
edit_paste_from_history (edit);
break;
case CK_Save_As:
#ifndef MIDNIGHT
if (edit->widget->options & EDITOR_NO_FILE)
break;
#endif
edit_save_as_cmd (edit);
break;
case CK_Save:
#ifndef MIDNIGHT
if (edit->widget->options & EDITOR_NO_FILE)
break;
#endif
edit_save_confirm_cmd (edit);
break;
case CK_Load:
#ifndef MIDNIGHT
if (edit->widget->options & EDITOR_NO_FILE)
break;
#endif
edit_load_cmd (edit);
break;
case CK_Save_Block:
edit_save_block_cmd (edit);
break;
case CK_Insert_File:
edit_insert_file_cmd (edit);
break;
case CK_Find:
edit_search_cmd (edit, 0);
break;
case CK_Find_Again:
edit_search_cmd (edit, 1);
break;
case CK_Replace:
edit_replace_cmd (edit, 0);
break;
case CK_Replace_Again:
edit_replace_cmd (edit, 1);
break;
case CK_Exit:
edit_quit_cmd (edit);
break;
case CK_New:
edit_new_cmd (edit);
break;
case CK_Help:
edit_help_cmd (edit);
break;
case CK_Refresh:
edit_refresh_cmd (edit);
break;
case CK_Date:{
time_t t;
time (&t);
edit_printf (edit, ctime (&t));
edit->force |= REDRAW_PAGE;
break;
}
case CK_Goto:
edit_goto_cmd (edit);
break;
case CK_Paragraph_Format:
format_paragraph (edit, 1);
edit->force |= REDRAW_PAGE;
break;
case CK_Delete_Macro:
edit_delete_macro_cmd (edit);
break;
#ifdef MIDNIGHT
case CK_Sort:
edit_sort_cmd (edit);
break;
case CK_Mail:
edit_mail_dialog (edit);
break;
#endif
/* These commands are not handled and must be handled by the user application */
#ifndef MIDNIGHT
case CK_Sort:
case CK_Mail:
#endif
case CK_Complete:
case CK_Cancel:
case CK_Save_Desktop:
case CK_New_Window:
case CK_Cycle:
case CK_Menu:
case CK_Save_And_Quit:
case CK_Check_Save_And_Quit:
case CK_Run_Another:
result = 0;
break;
}
#ifdef MIDNIGHT
/* CK_Pipe_Block */
if ((command / 1000) == 1) /* a shell command */
edit_block_process_cmd (edit, shell_cmd[command - 1000], 1);
#else
if ((command / 1000) == 1) /* a user defined command */
if (user_commamd)
(*user_commamd) (edit, command - 1000);
#endif
if (command > CK_Macro (0) && command <= CK_Last_Macro) { /* a macro command */
struct macro m[MAX_MACRO_LENGTH];
int nm;
if ((result = edit_load_macro_cmd (edit, m, &nm, command - 2000)))
edit_execute_macro (edit, m, nm);
}
/* keys which must set the col position, and the search vars */
switch (command) {
case CK_Find:
case CK_Find_Again:
case CK_Replace:
case CK_Replace_Again:
edit->prev_col = edit_get_col (edit);
return 1;
break;
case CK_Up:
case CK_Up_Highlight:
case CK_Down:
case CK_Down_Highlight:
case CK_Page_Up:
case CK_Page_Up_Highlight:
case CK_Page_Down:
case CK_Page_Down_Highlight:
case CK_Beginning_Of_Text:
case CK_Beginning_Of_Text_Highlight:
case CK_End_Of_Text:
case CK_End_Of_Text_Highlight:
case CK_Paragraph_Up:
case CK_Paragraph_Up_Highlight:
case CK_Paragraph_Down:
case CK_Paragraph_Down_Highlight:
case CK_Scroll_Up:
case CK_Scroll_Up_Highlight:
case CK_Scroll_Down:
case CK_Scroll_Down_Highlight:
edit->search_start = edit->curs1;
edit->found_len = 0;
edit_find_bracket (edit);
return 1;
break;
default:
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
}
edit_find_bracket (edit);
if (option_auto_para_formatting) {
switch (command) {
case CK_BackSpace:
case CK_Delete:
case CK_Delete_Word_Left:
case CK_Delete_Word_Right:
case CK_Delete_To_Line_End:
case CK_Delete_To_Line_Begin:
format_paragraph (edit, 0);
edit->force |= REDRAW_PAGE;
}
}
return result;
}
/* either command or char_for_insertion must be passed as -1 */
/* returns 0 if command is a macro that was not found, 1 otherwise */
int edit_execute_command (WEdit * edit, int command, int char_for_insertion)
{
int r;
r = edit_execute_cmd (edit, command, char_for_insertion);
edit_update_screen (edit);
return r;
}
void edit_execute_macro (WEdit * edit, struct macro macro[], int n)
{
int i = 0;
edit->force |= REDRAW_PAGE;
for (; i < n; i++) {
edit_execute_cmd (edit, macro[i].command, macro[i].ch);
}
edit_update_screen (edit);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?