Changeset 4f351432 in mainline for uspace/app/edit/edit.c
- Timestamp:
- 2012-08-16T22:17:52Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2568c94
- Parents:
- 83298e8 (diff), 6d5e378 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/edit/edit.c
r83298e8 r4f351432 91 91 typedef struct { 92 92 char *file_name; 93 sheet_t sh;93 sheet_t *sh; 94 94 } doc_t; 95 95 … … 126 126 static int file_save_range(char const *fname, spt_t const *spos, 127 127 spt_t const *epos); 128 static char *filename_prompt(char const *prompt, char const *init_value);129 128 static char *range_get_str(spt_t const *spos, spt_t const *epos); 129 130 static char *prompt(char const *prompt, char const *init_value); 130 131 131 132 static void pane_text_display(void); … … 142 143 static void caret_move_word_left(void); 143 144 static void caret_move_word_right(void); 145 static void caret_move_to_line(int row); 146 static void caret_go_to_line_ask(void); 144 147 145 148 static bool selection_active(void); … … 172 175 coord_t coord; 173 176 bool new_file; 177 int rc; 174 178 175 179 spt_t pt; … … 186 190 187 191 /* Start with an empty sheet. */ 188 sheet_init(&doc.sh); 192 rc = sheet_create(&doc.sh); 193 if (rc != EOK) { 194 printf("Out of memory.\n"); 195 return -1; 196 } 189 197 190 198 /* Place caret at the beginning of file. */ 191 199 coord.row = coord.column = 1; 192 sheet_get_cell_pt( &doc.sh, &coord, dir_before, &pt);193 sheet_place_tag( &doc.sh, &pt, &pane.caret_pos);200 sheet_get_cell_pt(doc.sh, &coord, dir_before, &pt); 201 sheet_place_tag(doc.sh, &pt, &pane.caret_pos); 194 202 pane.ideal_column = coord.column; 195 203 … … 213 221 /* Place selection start tag. */ 214 222 tag_get_pt(&pane.caret_pos, &pt); 215 sheet_place_tag( &doc.sh, &pt, &pane.sel_start);223 sheet_place_tag(doc.sh, &pt, &pane.sel_start); 216 224 217 225 /* Initial display */ … … 404 412 caret_move_word_left(); 405 413 break; 414 case KC_L: 415 caret_go_to_line_ask(); 416 break; 406 417 default: 407 418 break; … … 423 434 } 424 435 425 static void key_handle_movement(unsigned int key, bool select) 436 /** Move caret while preserving or resetting selection. */ 437 static void caret_movement(int drow, int dcolumn, enum dir_spec align_dir, 438 bool select) 426 439 { 427 440 spt_t pt; … … 435 448 had_sel = !spt_equal(&caret_pt, &pt); 436 449 437 switch (key) { 438 case KC_LEFT: 439 caret_move(0, -1, dir_before); 440 break; 441 case KC_RIGHT: 442 caret_move(0, 0, dir_after); 443 break; 444 case KC_UP: 445 caret_move(-1, 0, dir_before); 446 break; 447 case KC_DOWN: 448 caret_move(+1, 0, dir_before); 449 break; 450 case KC_HOME: 451 caret_move(0, -ED_INFTY, dir_before); 452 break; 453 case KC_END: 454 caret_move(0, +ED_INFTY, dir_before); 455 break; 456 case KC_PAGE_UP: 457 caret_move(-pane.rows, 0, dir_before); 458 break; 459 case KC_PAGE_DOWN: 460 caret_move(+pane.rows, 0, dir_before); 461 break; 462 default: 463 break; 464 } 450 caret_move(drow, dcolumn, align_dir); 465 451 466 452 if (select == false) { 467 453 /* Move sel_start to the same point as caret. */ 468 sheet_remove_tag( &doc.sh, &pane.sel_start);454 sheet_remove_tag(doc.sh, &pane.sel_start); 469 455 tag_get_pt(&pane.caret_pos, &pt); 470 sheet_place_tag( &doc.sh, &pt, &pane.sel_start);456 sheet_place_tag(doc.sh, &pt, &pane.sel_start); 471 457 } 472 458 … … 487 473 } 488 474 475 static void key_handle_movement(unsigned int key, bool select) 476 { 477 switch (key) { 478 case KC_LEFT: 479 caret_movement(0, -1, dir_before, select); 480 break; 481 case KC_RIGHT: 482 caret_movement(0, 0, dir_after, select); 483 break; 484 case KC_UP: 485 caret_movement(-1, 0, dir_before, select); 486 break; 487 case KC_DOWN: 488 caret_movement(+1, 0, dir_before, select); 489 break; 490 case KC_HOME: 491 caret_movement(0, -ED_INFTY, dir_before, select); 492 break; 493 case KC_END: 494 caret_movement(0, +ED_INFTY, dir_before, select); 495 break; 496 case KC_PAGE_UP: 497 caret_movement(-pane.rows, 0, dir_before, select); 498 break; 499 case KC_PAGE_DOWN: 500 caret_movement(+pane.rows, 0, dir_before, select); 501 break; 502 default: 503 break; 504 } 505 } 506 489 507 /** Save the document. */ 490 508 static int file_save(char const *fname) … … 520 538 char *fname; 521 539 522 fname = filename_prompt("Save As", old_fname);540 fname = prompt("Save As", old_fname); 523 541 if (fname == NULL) { 524 542 status_display("Save cancelled."); … … 535 553 } 536 554 537 /** Ask for a file name. */538 static char * filename_prompt(char const *prompt, char const *init_value)555 /** Ask for a string. */ 556 static char *prompt(char const *prompt, char const *init_value) 539 557 { 540 558 kbd_event_t ev; … … 657 675 658 676 do { 659 sheet_copy_out( &doc.sh, &sp, epos, buf, BUF_SIZE, &bep);677 sheet_copy_out(doc.sh, &sp, epos, buf, BUF_SIZE, &bep); 660 678 bytes = str_size(buf); 661 679 … … 692 710 693 711 while (true) { 694 sheet_copy_out( &doc.sh, &sp, epos, &buf[bpos], buf_size - bpos,712 sheet_copy_out(doc.sh, &sp, epos, &buf[bpos], buf_size - bpos, 695 713 &bep); 696 714 bytes = str_size(&buf[bpos]); … … 714 732 int sh_rows, rows; 715 733 716 sheet_get_num_rows( &doc.sh, &sh_rows);734 sheet_get_num_rows(doc.sh, &sh_rows); 717 735 rows = min(sh_rows - pane.sh_row + 1, pane.rows); 718 736 … … 784 802 rbc.row = pane.sh_row + i; 785 803 rbc.column = pane.sh_column; 786 sheet_get_cell_pt( &doc.sh, &rbc, dir_before, &rb);804 sheet_get_cell_pt(doc.sh, &rbc, dir_before, &rb); 787 805 788 806 /* Ending point for row display */ 789 807 rec.row = pane.sh_row + i; 790 808 rec.column = pane.sh_column + pane.columns; 791 sheet_get_cell_pt( &doc.sh, &rec, dir_before, &re);809 sheet_get_cell_pt(doc.sh, &rec, dir_before, &re); 792 810 793 811 /* Copy the text of the row to the buffer. */ 794 sheet_copy_out( &doc.sh, &rb, &re, row_buf, ROW_BUF_SIZE, &dep);812 sheet_copy_out(doc.sh, &rb, &re, row_buf, ROW_BUF_SIZE, &dep); 795 813 796 814 /* Display text from the buffer. */ … … 861 879 spt_t caret_pt; 862 880 coord_t coord; 881 int last_row; 863 882 864 883 tag_get_pt(&pane.caret_pos, &caret_pt); 865 884 spt_get_coord(&caret_pt, &coord); 866 885 886 sheet_get_num_rows(doc.sh, &last_row); 887 867 888 const char *fname = (doc.file_name != NULL) ? doc.file_name : "<unnamed>"; 868 889 869 890 console_set_pos(con, 0, scr_rows - 1); 870 891 console_set_style(con, STYLE_INVERTED); 871 int n = printf(" %d, %d : File '%s'. Ctrl-Q Quit Ctrl-S Save "872 "Ctrl-E Save As", coord.row, coord.column, fname);892 int n = printf(" %d, %d (%d): File '%s'. Ctrl-Q Quit Ctrl-S Save " 893 "Ctrl-E Save As", coord.row, coord.column, last_row, fname); 873 894 874 895 int pos = scr_columns - 1 - n; … … 906 927 cbuf[offs] = '\0'; 907 928 908 (void) sheet_insert( &doc.sh, &pt, dir_before, cbuf);929 (void) sheet_insert(doc.sh, &pt, dir_before, cbuf); 909 930 910 931 pane.rflags |= REDRAW_ROW; … … 923 944 924 945 coord.column -= 1; 925 sheet_get_cell_pt( &doc.sh, &coord, dir_before, &sp);926 927 (void) sheet_delete( &doc.sh, &sp, &ep);946 sheet_get_cell_pt(doc.sh, &coord, dir_before, &sp); 947 948 (void) sheet_delete(doc.sh, &sp, &ep); 928 949 929 950 pane.rflags |= REDRAW_ROW; … … 941 962 spt_get_coord(&sp, &sc); 942 963 943 sheet_get_cell_pt( &doc.sh, &sc, dir_after, &ep);964 sheet_get_cell_pt(doc.sh, &sc, dir_after, &ep); 944 965 spt_get_coord(&ep, &ec); 945 966 946 (void) sheet_delete( &doc.sh, &sp, &ep);967 (void) sheet_delete(doc.sh, &sp, &ep); 947 968 948 969 pane.rflags |= REDRAW_ROW; … … 1016 1037 else { 1017 1038 coord.row--; 1018 sheet_get_row_width( &doc.sh, coord.row, &coord.column);1039 sheet_get_row_width(doc.sh, coord.row, &coord.column); 1019 1040 } 1020 1041 } 1021 1042 if (drow > 0) { 1022 sheet_get_num_rows( &doc.sh, &num_rows);1043 sheet_get_num_rows(doc.sh, &num_rows); 1023 1044 if (coord.row > num_rows) coord.row = num_rows; 1024 1045 } … … 1033 1054 * coordinates. The character can be wider than one cell (e.g. tab). 1034 1055 */ 1035 sheet_get_cell_pt( &doc.sh, &coord, align_dir, &pt);1036 sheet_remove_tag( &doc.sh, &pane.caret_pos);1037 sheet_place_tag( &doc.sh, &pt, &pane.caret_pos);1056 sheet_get_cell_pt(doc.sh, &coord, align_dir, &pt); 1057 sheet_remove_tag(doc.sh, &pane.caret_pos); 1058 sheet_place_tag(doc.sh, &pt, &pane.caret_pos); 1038 1059 1039 1060 /* For non-vertical movement set the new value for @c ideal_column. */ … … 1055 1076 tag_get_pt(&pane.caret_pos, &pt); 1056 1077 1057 sheet_remove_tag( &doc.sh, &pane.sel_start);1058 sheet_place_tag( &doc.sh, &pt, &pane.sel_start);1078 sheet_remove_tag(doc.sh, &pane.sel_start); 1079 sheet_place_tag(doc.sh, &pt, &pane.sel_start); 1059 1080 } while (!pt_is_word_beginning(&pt)); 1060 1081 … … 1071 1092 tag_get_pt(&pane.caret_pos, &pt); 1072 1093 1073 sheet_remove_tag( &doc.sh, &pane.sel_start);1074 sheet_place_tag( &doc.sh, &pt, &pane.sel_start);1094 sheet_remove_tag(doc.sh, &pane.sel_start); 1095 sheet_place_tag(doc.sh, &pt, &pane.sel_start); 1075 1096 } while (!pt_is_word_beginning(&pt)); 1076 1097 1077 1098 pane.rflags |= REDRAW_TEXT; 1078 1099 } 1100 1101 /** Change the caret position to a beginning of a given line 1102 */ 1103 static void caret_move_to_line(int row) 1104 { 1105 spt_t pt; 1106 coord_t coord; 1107 1108 tag_get_pt(&pane.caret_pos, &pt); 1109 spt_get_coord(&pt, &coord); 1110 1111 caret_movement(row - coord.row, 0, dir_before, false); 1112 } 1113 1114 /** Ask for line and go to it. */ 1115 static void caret_go_to_line_ask(void) 1116 { 1117 char *sline; 1118 1119 sline = prompt("Go to line", ""); 1120 if (sline == NULL) { 1121 status_display("Go to line cancelled."); 1122 return; 1123 } 1124 1125 char *endptr; 1126 int line = strtol(sline, &endptr, 10); 1127 if (*endptr != '\0') { 1128 status_display("Invalid number entered."); 1129 return; 1130 } 1131 1132 caret_move_to_line(line); 1133 } 1134 1079 1135 1080 1136 /** Check for non-empty selection. */ … … 1115 1171 1116 1172 if (rel < 0) 1117 sheet_delete( &doc.sh, &pa, &pb);1173 sheet_delete(doc.sh, &pa, &pb); 1118 1174 else 1119 sheet_delete( &doc.sh, &pb, &pa);1175 sheet_delete(doc.sh, &pb, &pa); 1120 1176 1121 1177 if (ca.row == cb.row) … … 1139 1195 static void selection_sel_range(spt_t pa, spt_t pb) 1140 1196 { 1141 sheet_remove_tag( &doc.sh, &pane.sel_start);1142 sheet_place_tag( &doc.sh, &pa, &pane.sel_start);1143 sheet_remove_tag( &doc.sh, &pane.caret_pos);1144 sheet_place_tag( &doc.sh, &pb, &pane.caret_pos);1197 sheet_remove_tag(doc.sh, &pane.sel_start); 1198 sheet_place_tag(doc.sh, &pa, &pane.sel_start); 1199 sheet_remove_tag(doc.sh, &pane.caret_pos); 1200 sheet_place_tag(doc.sh, &pb, &pane.caret_pos); 1145 1201 1146 1202 pane.rflags |= REDRAW_TEXT; … … 1225 1281 1226 1282 coord.row = coord.column = 1; 1227 sheet_get_cell_pt( &doc.sh, &coord, dir_before, pt);1283 sheet_get_cell_pt(doc.sh, &coord, dir_before, pt); 1228 1284 } 1229 1285 … … 1234 1290 int num_rows; 1235 1291 1236 sheet_get_num_rows( &doc.sh, &num_rows);1292 sheet_get_num_rows(doc.sh, &num_rows); 1237 1293 coord.row = num_rows + 1; 1238 1294 coord.column = 1; 1239 1295 1240 sheet_get_cell_pt( &doc.sh, &coord, dir_after, pt);1296 sheet_get_cell_pt(doc.sh, &coord, dir_after, pt); 1241 1297 } 1242 1298 … … 1249 1305 coord.column = 1; 1250 1306 1251 sheet_get_cell_pt( &doc.sh, &coord, dir_before, spt);1307 sheet_get_cell_pt(doc.sh, &coord, dir_before, spt); 1252 1308 } 1253 1309 … … 1259 1315 1260 1316 spt_get_coord(cpt, &coord); 1261 sheet_get_row_width( &doc.sh, coord.row, &row_width);1317 sheet_get_row_width(doc.sh, coord.row, &row_width); 1262 1318 coord.column = row_width - 1; 1263 1319 1264 sheet_get_cell_pt( &doc.sh, &coord, dir_after, ept);1320 sheet_get_cell_pt(doc.sh, &coord, dir_after, ept); 1265 1321 } 1266 1322 … … 1288 1344 1289 1345 coord.column -= 1; 1290 sheet_get_cell_pt( &doc.sh, &coord, dir_before, &lp);1346 sheet_get_cell_pt(doc.sh, &coord, dir_before, &lp); 1291 1347 1292 1348 return pt_is_delimiter(&lp) … … 1310 1366 1311 1367 coord.column += 1; 1312 sheet_get_cell_pt( &doc.sh, &coord, dir_after, &rp);1368 sheet_get_cell_pt(doc.sh, &coord, dir_after, &rp); 1313 1369 1314 1370 ch = range_get_str(pt, &rp); … … 1336 1392 1337 1393 coord.column += 1; 1338 sheet_get_cell_pt( &doc.sh, &coord, dir_after, &rp);1394 sheet_get_cell_pt(doc.sh, &coord, dir_after, &rp); 1339 1395 1340 1396 ch = range_get_str(pt, &rp);
Note:
See TracChangeset
for help on using the changeset viewer.