Changeset e5d4294 in mainline for uspace/app/edit/edit.c


Ignore:
Timestamp:
2009-09-16T21:31:46Z (15 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
57688fe2
Parents:
8c73012 (diff), 743e17b (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.
Message:

Merge editor improvements from ~jsvoboda/helenos/edit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/edit/edit.c

    r8c73012 re5d4294  
    7272        /** Current position of the caret */
    7373        tag_t caret_pos;
     74
     75        /**
     76         * Ideal column where the caret should try to get. This is used
     77         * for maintaining the same column during vertical movement.
     78         */
     79        int ideal_column;
    7480} pane_t;
    7581
     
    130136
    131137        pane.rows = scr_rows - 1;
     138        pane.columns = scr_columns;
    132139        pane.sh_row = 1;
     140        pane.sh_column = 1;
    133141
    134142        /* Start with an empty sheet. */
     
    139147        sheet_get_cell_pt(&doc.sh, &coord, dir_before, &pt);
    140148        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
     149        pane.ideal_column = coord.column;
    141150
    142151        if (argc == 2) {
     
    206215        case KC_ENTER:
    207216                insert_char('\n');
    208                 pane.rflags |= REDRAW_TEXT;
    209217                caret_update();
    210218                break;
     
    235243        case KC_BACKSPACE:
    236244                delete_char_before();
    237                 pane.rflags |= REDRAW_TEXT;
    238245                caret_update();
    239246                break;
    240247        case KC_DELETE:
    241248                delete_char_after();
    242                 pane.rflags |= REDRAW_TEXT;
    243249                caret_update();
    244250                break;
     
    246252                if (ev->c >= 32 || ev->c == '\t') {
    247253                        insert_char(ev->c);
    248                         pane.rflags |= REDRAW_ROW;
    249254                        caret_update();
    250255                }
     
    402407static void pane_row_range_display(int r0, int r1)
    403408{
    404         int width;
    405409        int i, j, fill;
    406410        spt_t rb, re, dep;
     
    415419        console_goto(con, 0, 0);
    416420        for (i = r0; i < r1; ++i) {
    417                 sheet_get_row_width(&doc.sh, pane.sh_row + i, &width);
    418 
    419                 /* Determine row starting point. */
    420                 rbc.row = pane.sh_row + i; rbc.column = 1;
     421                /* Starting point for row display */
     422                rbc.row = pane.sh_row + i;
     423                rbc.column = pane.sh_column;
    421424                sheet_get_cell_pt(&doc.sh, &rbc, dir_before, &rb);
    422425
    423                 /* Determine row ending point. */
    424                 rec.row = pane.sh_row + i; rec.column = width + 1;
     426                /* Ending point for row display */
     427                rec.row = pane.sh_row + i;
     428                rec.column = pane.sh_column + pane.columns;
    425429                sheet_get_cell_pt(&doc.sh, &rec, dir_before, &re);
    426430
     
    494498
    495499        spt_get_coord(&caret_pt, &coord);
    496         console_goto(con, coord.column - 1, coord.row - pane.sh_row);
     500        console_goto(con, coord.column - pane.sh_column,
     501            coord.row - pane.sh_row);
    497502}
    498503
     
    511516
    512517        (void) sheet_insert(&doc.sh, &pt, dir_before, cbuf);
     518
     519        pane.rflags |= REDRAW_ROW;
     520        if (c == '\n')
     521                pane.rflags |= REDRAW_TEXT;
    513522}
    514523
     
    526535
    527536        (void) sheet_delete(&doc.sh, &sp, &ep);
     537
     538        pane.rflags |= REDRAW_ROW;
     539        if (coord.column < 1)
     540                pane.rflags |= REDRAW_TEXT;
    528541}
    529542
     
    532545{
    533546        spt_t sp, ep;
    534         coord_t coord;
     547        coord_t sc, ec;
    535548
    536549        tag_get_pt(&pane.caret_pos, &sp);
    537         spt_get_coord(&sp, &coord);
    538 
    539         sheet_get_cell_pt(&doc.sh, &coord, dir_after, &ep);
     550        spt_get_coord(&sp, &sc);
     551
     552        sheet_get_cell_pt(&doc.sh, &sc, dir_after, &ep);
     553        spt_get_coord(&ep, &ec);
    540554
    541555        (void) sheet_delete(&doc.sh, &sp, &ep);
     556
     557        pane.rflags |= REDRAW_ROW;
     558        if (ec.row != sc.row)
     559                pane.rflags |= REDRAW_TEXT;
    542560}
    543561
     
    555573        spt_get_coord(&pt, &coord);
    556574
    557         /* Scroll pane as necessary. */
     575        /* Scroll pane vertically. */
    558576
    559577        if (coord.row < pane.sh_row) {
     
    561579                pane.rflags |= REDRAW_TEXT;
    562580        }
     581
    563582        if (coord.row > pane.sh_row + pane.rows - 1) {
    564583                pane.sh_row = coord.row - pane.rows + 1;
     
    566585        }
    567586
     587        /* Scroll pane horizontally. */
     588
     589        if (coord.column < pane.sh_column) {
     590                pane.sh_column = coord.column;
     591                pane.rflags |= REDRAW_TEXT;
     592        }
     593
     594        if (coord.column > pane.sh_column + pane.columns - 1) {
     595                pane.sh_column = coord.column - pane.columns + 1;
     596                pane.rflags |= REDRAW_TEXT;
     597        }
     598
    568599        pane.rflags |= (REDRAW_CARET | REDRAW_STATUS);
    569 
    570600}
    571601
     
    582612        coord_t coord;
    583613        int num_rows;
     614        bool pure_vertical;
    584615
    585616        tag_get_pt(&pane.caret_pos, &pt);
     
    594625                if (coord.row > num_rows) coord.row = num_rows;
    595626        }
     627
     628        /* For purely vertical movement try attaining @c ideal_column. */
     629        pure_vertical = (dcolumn == 0 && align_dir == dir_before);
     630        if (pure_vertical)
     631                coord.column = pane.ideal_column;
    596632
    597633        /*
     
    603639        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
    604640
     641        /* For non-vertical movement set the new value for @c ideal_column. */
     642        if (!pure_vertical) {
     643                spt_get_coord(&pt, &coord);
     644                pane.ideal_column = coord.column;
     645        }
     646
    605647        caret_update();
    606648}
Note: See TracChangeset for help on using the changeset viewer.